Je suis en train d'exécuter la requête suivante dans SQLite 3:Problème avec SQLite SQL Query
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;
Mais je reçois l'erreur suivante:
SQLSTATE[HY000]: General error: 1 a GROUP BY clause is required before HAVING
Je ne comprends pas pourquoi SQLite veut moi aux résultats du groupe, mais j'essayé ce qui suit:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
Et j'ai aussi essayé ceci:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
Aucune erreur, mais tous les enregistrements ont été renvoyés (même ceux ayant "distance" > ?
). J'ai également essayé de faire:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
AND "distance" <= ?
ORDER BY "distance" ASC;
La même sortie, tous les enregistrements ont été retournés. J'ai vérifié - la distance est calculée correctement ... Je n'ai aucune idée de ce qui ne va pas avec cette requête, quelqu'un peut-il m'aider?
Mais j'ai essayé de spécifier une clause 'GROUP BY' ... Est-il possible de lancer la requête sans avoir à appeler deux fois la fonction' DISTANCE'? Cela rendrait la requête beaucoup plus rapide. –
Hummm ... Je ne suis pas non plus un grand fan des requêtes imbriquées, la page 8 de http://www.arubin.org/files/geo_search.pdf est beaucoup plus simple. MySQL Manual (http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html) dit "Le standard SQL n'autorise pas la clause HAVING à nommer une colonne qui n'est pas trouvée dans la clause GROUP BY si elle n'est pas incluse dans une fonction d'agrégation ". Est-ce spécifique à SQLite? Désolé d'être un PITA mais d'une autre façon de contourner ce problème? –
@Alix: Il n'y a pas d'autres options pour minimiser le nombre de fois que vous utilisez 'DISTANCE'. 'DISTANCE' n'est pas une fonction d'agrégat, donc la comparaison appartient à la clause' WHERE'. La seule raison d'utiliser 'HAVING' est parce que vous regroupez des enregistrements - ce qui est peu probable pour une table de pays. –