Frage

Diese Frage ist ein exaktes Duplikat von:

Ich versuche, führen Sie die folgende Abfrage in SQLite 3:

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

Aber ich bekomme den folgenden Fehler:

SQLSTATE[HY000]:Allgemeine Fehler:1 GROUP BY-Klausel ist erforderlich, bevor MIT

Ich verstehe nicht, warum SQLite will, dass ich zu der Gruppe die Ergebnisse, aber ich habe versucht, die folgenden:

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

Und ich habe auch versucht, dies:

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

Keine Fehler, aber alle Datensätze zurückgegeben wurden (sogar diejenigen, die das "distance" > ?).Ich habe auch versucht zu tun:

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

Gleichen Ausgang, alle Datensätze zurückgegeben wurden.Ich habe doppelt geprüft - der Abstand ist korrekt berechnet...Ich habe keine Ahnung, was falsch mit dieser Abfrage kann mir jemand helfen?

War es hilfreich?

Lösung

Sie können keine HAVING Klausel angeben, ohne eine GROUP BY Klausel angegeben haben. Verwendung:

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

Wenn Sie nicht DISTANCE mehr als einmal anrufen möchten, können Sie eine Unterabfrage verwenden:

  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;

Andere Tipps

Eine bessere (und schneller) Ansatz könnte sein, den ausgewählten Satz zu reduzieren, bevor durch die Reihenfolge der Anwendung. Ich benutze diese Art von Ansatz:

SELECT * FROM Orte, an denen abs (Breite - 51,123) <0,12 und abs (Längengrad - 0.123) <0,34 ORDER BY DISTANCE (Breite, Länge, 51,123, 0,123)

... wo (51,123, 0,123) ist der Mittelpunkt Breite / Länge Punkt Sie suchen in Bezug auf, und die Werte von 0,12 und 0,34 werden verwendet, um die Suche zu verfeinern, um eine lat / long Quadrat-on-a -sphere einer geeigneten Größe (dh ein Quadrat von n Kilometern von n Kilometern an diesem Punkt auf der Kugel der Erde, wo die Größe auf der durchschnittlichen geographische Verteilung Ihrer Standorte abhängt). Ich verwende die Grad Länge Formeln von http://en.wikipedia.org/wiki/Longitude um herauszufinden, was sollten diese Werte den Suchpunktes der Position auf der Erde Kugel gegeben werden.

ist es Syntaxfehler, Sie ‚von der Gruppe‘ zu verwenden müssen, wenn Sie verwenden, die Ursache,

Ihre Abfrage mit der Gruppe durch, um Datensätze zu holen mit ( „Abstand“>), da gibt es Datenbankregel, dass vor allem sie Daten mit passenden Datensatz nehmen, dann wird es Gruppe durchführen, indem Sie auf sie, nachdem sie es Aufzeichnungen Filterung, indem Ursache. so dass Sie nie Daten erhalten haben ( "Abstand" <)

Bitte korrigieren wenn ich falsch bin

Weiter zu die richtige gekennzeichnet Antwort oben, wenn Sie nicht anrufen möchten ENTFERNUNG Funktion zweimal, Lesen Sie den alias in der WHERE-Klausel, ich.e:

 SELECT *, 
         DISTANCE(latitude, longitude, ?, ?) AS dist
    FROM COUNTRY c
   WHERE c.id NOT LIKE ?
     AND dist <= ?
ORDER BY dist;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top