我试图运行的SQLite 3以下查询:故障使用SQLite SQL查询
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;
,但我得到了以下错误:
SQLSTATE[HY000]: General error: 1 a GROUP BY clause is required before HAVING
我不明白为什么要的SQLite我组的结果,但我仍然尝试了以下内容:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
而且我也试过这样:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
没有错误,但所有记录都被返回(即使是那些有"distance" > ?
)。我也试过:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
AND "distance" <= ?
ORDER BY "distance" ASC;
同样的输出,所有的记录都被返回。我已经加倍检查 - 距离正确计算...我不知道这个查询有什么问题,有人可以帮我吗?
但我曾尝试指定一个“GROUP BY”子句......有没有什么办法可以运行查询,而无需调用两次'DISTANCE'函数?这会使查询运行速度更快。 – 2010-01-20 05:03:27
Hummm ...我不是嵌套查询的忠实粉丝,http://www.arubin.org/files/geo_search.pdf的第8页更直截了当。 MySQL手册(http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html)说:“SQL标准不允许HAVING子句命名任何未找到的列在GROUP BY子句中,如果它不包含在聚合函数中“。这是SQLite的特定?对不起,成为一个PITA,但有任何其他方式来解决这个问题? – 2010-01-20 05:14:00
@Alix:没有任何其他选项可以最大限度地减少使用“DISTANCE”的次数。 DISTANCE不是一个聚合函数,所以比较属于'WHERE'子句。使用'HAVING'的唯一原因是因为你实际上是将记录分组 - 这对于一个国家的表来说不太可能。 – 2010-01-20 05:23:34