计数查询返回意外结果

时间:2011-06-22 23:12:57

标签: mysql sql

我有这个问题:

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英里的用户数量。但相反,它给了我一个用户总数。如果lat / lng不同,当有一些用户时,它会给我零用户数。

如何更改此查询以获取半径150米范围内的用户数量?

谢谢!

2 个答案:

答案 0 :(得分:6)

您想使用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

答案 1 :(得分:3)

扩展Dirk的答案......

  • WHERE子句在它们全部连接后应用于记录。
  • 在任何聚合完成后应用HAVING子句。

此外,正如在Dirk的回答中,您无需在SELECT中进行计算即可在其他地方使用它。

因此,Dirk的答案计算每个ROW的距离(在连接之后,在聚合之前),然后丢弃距离为150或更多的任何一个。它只会聚合并计算所有内容。