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

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top