Mysql查询距离搜索失败

时间:2012-02-18 18:03:27

标签: mysql

HY!

我的表:

CREATE TABLE IF NOT EXISTS `USER_SETTING` (
  `USER_ID` int(11) NOT NULL,
  `LATITUDE` float(10,6) NOT NULL DEFAULT '0.000000',
  `LONGITUDE` float(10,6) NOT NULL DEFAULT '0.000000',
  `MINAGE` int(11) DEFAULT NULL,
  `GENDER` varchar(1) DEFAULT NULL,
  `DISTANCE` int(11) DEFAULT NULL,
  `MAXAGE` int(11) NOT NULL,
  PRIMARY KEY (`USER_ID`)
)

查询:

SELECT
    user_id,
    LONGITUDE,
    LATITUDE,
    MINAGE,
    MAXAGE,
    DISTANCE,
    (
      6371 * acos(
                cos(
                   radians(47.958153)
                ) * cos(
                   radians(LANGITUDE)
                ) * cos(
                   radians(LATITUDE) - radians(13.780375)
                ) + sin(
                   radians(47.958153)
                ) * sin(
                   radians(LANGITUDE)
                )
           )
    ) AS range
FROM
    USER_SETTING
HAVING
    range < 800
ORDER BY
    range
LIMIT 0, 20

问题:

查询不起作用。

错误讯息:

  

您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   接近'范围FROM USER_SETTING HAVING range&lt; 800 ORDER BY范围   在第1行限制0,20'

请帮助

3 个答案:

答案 0 :(得分:1)

HAVING仅适用于GROUP'ed列。由于我在查询中没有注意到任何GROUP,因此我将其修改为使用WHERE子句。

SELECT user_id,
       LONGITUDE,
       LATITUDE,
       MINAGE,
       MAXAGE,
       DISTANCE,
       (6371 * acos( cos( radians(47.958153) ) * cos( radians(LANGITUDE)) * cos(radians(LATITUDE) - radians(13.780375)) + sin(radians(47.958153)) * sin(radians(LANGITUDE)))) AS range
FROM USER_SETTING
WHERE range < 800
ORDER BY range
LIMIT 0 , 20

答案 1 :(得分:0)

您需要添加Group by子句才能使用HAVING,否则请使用:

Where range < 800

答案 2 :(得分:0)

这个演讲是我在这个主题上看到的最好的。我包括工作查询等,以及一般的距离计算的性能提示和技巧。

http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL