Запрос количества, возвращающий неожиданные результаты - PullRequest
3 голосов
/ 23 июня 2011

У меня есть этот запрос:

SELECT
    count(*) as count ,
    ( 3959 * acos(
        cos( radians( 37.774929 ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians( -122.419418 ) )
        + sin( radians( 37.774929 ) ) * sin( radians( lat ) )
    ) ) AS distance
FROM users
HAVING distance < 150

Я думал, что он даст мне количество пользователей, которые находятся в радиусе 150 миль.Но вместо этого он дал мне общее количество пользователей.И если бы широта / долгота были другими, я бы получил нулевое количество пользователей, когда там было несколько пользователей.

Есть идеи, как изменить этот запрос, чтобы получить количество пользователей в радиусе 150 миль?

Спасибо!

Ответы [ 2 ]

6 голосов
/ 23 июня 2011

Вы хотите использовать предложение WHERE

select count(*) as count from users WHERE ( 3959 * acos( cos( radians( 37.774929 ) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians( -122.419418 ) ) + sin( radians( 37.774929 ) ) * sin( radians( lat ) ) ) ) < 150
3 голосов
/ 23 июня 2011

Чтобы расширить ответ Дирка ...

  • Предложение WHERE применяется к записям после их объединения.
  • Предложение HAVING применяется после завершения агрегации.

Кроме того, как и в ответе Дирка, вам не нужно иметь вычисление в SELECT, чтобы иметь возможность использовать его в другом месте.

Таким образом, в ответе Дирка вычисляется Расстояние для каждой отдельной строки (после объединений, перед агрегацией), а затем отбрасывается любое с расстоянием 150 или более. Это ТОЛЬКО ЗАТЕМ собирает и подсчитывает все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...