Problemi con SQLite SQL query [duplicato]
Domanda
Questa domanda è un esatto duplicato di:
- SQLite - clausola WHERE & UDF 4 risposte
Sto cercando di eseguire la seguente query in SQLite 3:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;
Ma ottengo il seguente errore:
SQLSTATE [HY000]: Errore generale: 1 un GROUP BY è necessario prima VISTA
Non capisco il motivo per cui SQLite vuole che i risultati del gruppo, ma ancora ho provato quanto segue:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
E ho provato anche questo:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
Non ci sono errori, ma tutti i record sono stati restituiti (anche quelli che hanno "distance" > ?
). Ho anche provato a fare:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
AND "distance" <= ?
ORDER BY "distance" ASC;
stessa uscita, sono stati restituiti tutti i record. Ho ricontrollato -? La distanza viene calcolato correttamente ... Non ho idea di che cosa c'è di sbagliato in questa query, qualcuno può darmi una mano
Soluzione
Non è possibile specificare una clausola HAVING
senza aver specificato una clausola GROUP BY
. Usa:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?
AND DISTANCE(c.latitude, c.longitude, ?, ?) <= ?
ORDER BY dist;
Se non si desidera chiamare DISTANZA più di una volta, è possibile utilizzare una sottoquery:
SELECT x.*
FROM (SELECT c.*,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?) x
WHERE x.dist <= ?
ORDER BY dist;
Altri suggerimenti
Un approccio migliore (e più veloce) potrebbe essere quella di ridurre giù il set selezionato prima di applicare l'ORDER BY. Io uso questo tipo di approccio:
SELECT * FROM luoghi in cui abs (Latitudine - 51,123) <0,12 e abs (Longitudine - 0.123) <0,34 ORDER BY DISTANZA (latitudine, longitudine, 51,123, 0,123)
... dove (51,123, 0,123) è il punto centrale di latitudine / longitudine siete alla ricerca relativi a, ed i valori di 0,12 e 0,34 sono utilizzati per restringere la ricerca ad un una piazza-on-lat / lungo -sphere di dimensioni adeguate (per esempio un quadrato di n chilometri da n chilometri a quel punto sulla sfera terrestre, in cui la dimensione dipende dalla distribuzione geografica media delle località). Io uso le formule lunghezza di laurea da http://en.wikipedia.org/wiki/Longitude di capire cosa questi valori dovrebbe essere data la posizione del punto di ricerca sulla sfera terrestre.
è errore di sintassi, è necessario disporre di usare 'gruppo da' quando si utilizza avendo causa,
la query con il gruppo vicino è il recupero record che ( "distanza">), perché, non v'è regola base di dati che prima di tutto ci vogliono dati con i record corrispondenti allora si esibirà gruppo da su di esso dopo che si sta filtrando record avendo causa. in modo da non ottenere i dati che hanno ( "distanza" <)
Si prega di correggere se sbaglio
A seguito della corretta contrassegnato risposta di cui sopra, se non si desidera chiamare funzione di distanza due volte, fare riferimento alla alias nella clausola WHERE, cioè:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS dist
FROM COUNTRY c
WHERE c.id NOT LIKE ?
AND dist <= ?
ORDER BY dist;