Pregunta

    

Esta pregunta es un duplicado exacto de:

    
            
  •              SQLite - cláusula WHERE y UDF                                      4 respuestas                          
  •     
    

Estoy tratando de ejecutar la consulta siguiente en SQLite 3:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
HAVING "distance" <= ?
ORDER BY "distance" ASC;

Pero me sale el siguiente error:

  

SQLSTATE [HY000]: Error general: 1 una   Cláusula GROUP BY se requiere antes   HAVING

No entiendo por qué SQLite quiere que los resultados del grupo, pero aún así trató lo siguiente:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "id"
HAVING "distance" <= ?
ORDER BY "distance" ASC;

Y también intentó esto:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
GROUP BY "distance"
HAVING "distance" <= ?
ORDER BY "distance" ASC;
fueron devueltos

No hay errores, pero todos los registros (incluso los que tienen "distance" > ?). También he intentado hacer:

SELECT *,
  DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
  AND "distance" <= ?
ORDER BY "distance" ASC;

misma salida, se devolvieron todos los registros. He comprobado doble - la distancia se calcula correctamente ... no tengo idea de lo que está mal con esta consulta, Alguien me puede ayudar a cabo

¿Fue útil?

Solución

No puede especificar una cláusula HAVING sin haber especificado una cláusula GROUP BY. Uso:

  SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND DISTANCE(c.latitude, c.longitude, ?, ?) <= ?
ORDER BY dist;

Si no desea llamar DISTANCIA más de una vez, se puede utilizar una subconsulta:

  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;

Otros consejos

enfoque

Una mejor (y más rápido) podría ser la reducción de abajo del conjunto seleccionado antes de aplicar el ORDER BY. Yo uso este tipo de enfoque:

SELECT * FROM lugares donde abs (Latitud - 51.123) <0,12 y abs (longitud - 0.123) <0,34 ORDER BY distancia (Latitud, Longitud, 51.123, 0.123)

... donde (51.123, 0.123) es el punto central de latitud / longitud que está buscando en relación con, y los valores de 0,12 y 0,34 se utiliza para restringir la búsqueda a una latitud / longitud cuadrados en una -sphere de un tamaño apropiado (es decir, un cuadrado de n kilómetros por n kilómetros en ese punto en la esfera de la Tierra, donde el tamaño depende de la distribución geográfica promedio de sus ubicaciones). Utilizo las fórmulas longitud de grado de http://en.wikipedia.org/wiki/Longitude a trabajar en lo que estos valores se debe dar la posición del punto de búsqueda en la esfera de la Tierra.

es error de sintaxis, que debe tener para su uso 'grupo por' cuando se utiliza con causa,

la consulta con el grupo de es ir a buscar los registros que contienen ( "distancia">), ya que, no hay regla de base de datos que primero de todo lo que toma de datos con registros coincidentes a continuación, se llevará a cabo el grupo por sobre ella después de que se está filtrando los registros por tener porque. por lo que nunca obtener los datos que tienen ( "distancia" <)

Por favor, corrija si estoy equivocado

En relación con la respuesta correcta Marcados arriba, si no desea llamar función de distancia dos veces, consulte el alias en la cláusula WHERE, es decir:

 SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND dist <= ?
ORDER BY dist;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top