Следующий запрос дает мне столбец расстояний. Но мне нужно только количество результатов с совпадающими расстояниями, а не сами расстояния. Подвыборку использовать нельзя.

SELECT 
( 6368 * SQRT(2*(1-cos(RADIANS(loc_lat)) * cos(0.899945742869) * (sin(RADIANS(`loc_lon`)) * sin(0.14286767838) + cos(RADIANS(`loc_lon`)) * cos(0.14286767838)) - sin(RADIANS(loc_lat)) * sin(0.899945742869))) ) AS Distance

FROM ...

WHERE ...

HAVING Distance > 0 AND Distance <= 25 
4
Mike 29 Авг 2011 в 18:19

3 ответа

Лучший ответ

Если вам не нужны расстояния, а только счет, возможно, это сработает:

SELECT Count(*)
FROM ...
WHERE ... AND
  (6368 * SQRT(2*(1-cos(RADIANS(loc_lat)) * cos(0.899945742869) *
  (sin(RADIANS(`loc_lon`)) * sin(0.14286767838) + cos(RADIANS(`loc_lon`)) *
   cos(0.14286767838)) - sin(RADIANS(loc_lat)) * sin(0.899945742869)))
  ) BETWEEN 0 AND 25
2
Kobi 29 Авг 2011 в 14:29

Вам просто нужно переместить расчет расстояния в предложение where:

SELECT COUNT(*) FROM ...

WHERE ( 6368 * SQRT(2*(1-...) BETWEEN 0 AND 25
3
Vinay Pai 29 Авг 2011 в 14:29

Это даст totalResults, и вы можете отбросить другой столбец.

 SELECT COUNT(*) totalResults, 
    ( 6368 * SQRT(2*(1-cos(RADIANS(loc_lat)) * cos(0.899945742869) * (sin(RADIANS(`loc_lon`)) * sin(0.14286767838) + cos(RADIANS(`loc_lon`)) * cos(0.14286767838)) - sin(RADIANS(loc_lat)) * sin(0.899945742869))) ) AS Distance

    FROM ...

    WHERE ...

    HAVING Distance > 0 AND Distance <= 25 
1
ajacian81 29 Авг 2011 в 14:20