Я пытаюсь выполнить следующий запрос в SQLite 3:Проблемы с SQLite SQL Query
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? Это сделает запрос намного быстрее. –
Hummm ... Я тоже не большой поклонник вложенных запросов, страница 8 из http://www.arubin.org/files/geo_search.pdf гораздо более проста. Руководство MySQL (http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html) говорит: «Стандарт SQL не позволяет предложению HAVING назвать любой столбец, который не найден в предложении GROUP BY, если он не заключен в агрегированную функцию ". Является ли этот SQLite конкретным? Извините за то, что я был PITA, но каким-то другим способом обойти это? –
@Alix: Нет никаких других вариантов минимизации количества раз, когда вы используете 'DISTANCE'. 'DISTANCE' не является агрегированной функцией, поэтому сравнение принадлежит предложению' WHERE'. Единственная причина использования 'HAVING' заключается в том, что вы на самом деле группируете записи, что маловероятно для таблицы стран. –