open - sqlite tutorial
Problemas con SQLite SQL Query (4)
No puede especificar una cláusula HAVING
sin haber especificado una cláusula GROUP BY
. Utilizar:
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 a DISTANCE más de una vez, puede usar 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;
Esta pregunta es un duplicado exacto de:
- SQLite - WHERE Clause & UDFs 4 respuestas
Estoy tratando de ejecutar la siguiente consulta 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 se requiere una cláusula GROUP BY antes de TENER
No entiendo por qué SQLite quiere que agrupe los resultados, pero aún así intenté 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;
No hay errores, pero se devolvieron todos los registros (incluso aquellos que tienen "distance" > ?
). También intenté hacer:
SELECT *,
DISTANCE(latitude, longitude, ?, ?) AS "distance"
FROM "country"
WHERE "id" NOT LIKE ?
AND "distance" <= ?
ORDER BY "distance" ASC;
Mismo resultado, todos los registros fueron devueltos. He comprobado dos veces: la distancia se calcula correctamente ... No tengo idea de qué pasa con esta consulta, ¿alguien puede ayudarme?
Un enfoque mejor (y más rápido) podría ser reducir el conjunto SELECCIONADO antes de aplicar el ORDER BY. Yo uso este tipo de enfoque:
SELECCIONAR * FROM Ubicaciones DONDE abs (Latitud - 51.123) <0.12 Y abs (Longitud - 0.123) <0.34 ORDENAR POR DISTANCIA (Latitud, Longitud, 51.123, 0.123)
... donde (51.123, 0.123) es el punto de latitud / longitud central con el que realiza una búsqueda, y los valores de 0.12 y 0.34 se usan para restringir su búsqueda a un cuadrado / latitud larga sobre una esfera de un tamaño apropiado (es decir, un cuadrado de n kilómetros por n kilómetros en ese punto de la esfera de la Tierra, donde el tamaño depende de la distribución geográfica promedio de sus ubicaciones). Utilizo las fórmulas de longitud de grado de http://en.wikipedia.org/wiki/Longitude para determinar qué valores se deben dar a la posición del punto de búsqueda en la esfera de la Tierra.
es un error de sintaxis, debes tener que usar ''group by'' cuando estás usando una causa,
su búsqueda con group by está obteniendo registros que tienen ("distance">) porque, hay una regla de base de datos que primero toma datos con registros que coincidan, entonces realizará group by on después de que está filtrando registros por tener causa. para que nunca tengas datos que tengan ("distancia" <)
por favor corrija si estoy equivocado
Además de la respuesta correcta marcada arriba, si no desea llamar a la función DISTANCE 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;