我試圖運行的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