3 Stimmen

Abfrage mit HAVING und WHERE

Ich versuche, eine einzige Abfrage zu erstellen, die die folgenden beiden Abfragen kombiniert.

SELECT 
  campgroundid, 
  ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
  AS distance 
FROM campground 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

SELECT * FROM campground WHERE type='private' AND wifi = 1

Ich habe versucht, sie in ein IN zu setzen, aber es gab einen Syntaxfehler zurück, den ich nicht beheben konnte. Ich habe versucht, das HAVING zu entfernen und die Abfragen zu kombinieren, aber dann sagt es, dass es nicht in der Lage ist, herauszufinden, was distance ist. Für jede Hilfe sind wir dankbar. Danke.

OUTPUT: [campgroundid, name, type, wifi, entfernung] [1,camp ABC, privat, 1, 1.34 mi] [2,Campingplatz XYZ, privat, 1, 4.44 mi]

3voto

Larry Lustig Punkte 47313

Zu den Informationen, die nicht gegeben werden, gehört, wie der Campingplatz und die Markierungstafeln zusammenhängen. Wir brauchen diese Information, um zu wissen, wie wir die Tabellen JOINen können.

Außerdem erfordert HAVING GROUP BY (es funktioniert wie eine WHERE-Klausel für die aggregierten Ergebnisse von GROUP BY). Wenn Sie die Zeilen in Markierungen nicht aggregieren, benötigen Sie WHERE und nicht HAVING.

Ich schätze, Sie wollen etwas in der Art:

 SELECT id (expression) as distance FROM markers
      WHERE distance < 25 AND 
        campground_id IN (SELECT id FROM campgrounds WHERE type = 'private' AND wifi = 1)

EDIT: Unter Berücksichtigung der neuen Information, dass es nur eine Tabelle gibt.

Sie können keine Spalten-ALIASe in einer WHERE-Klausel verwenden. Ich gehe davon aus, dass Sie das wissen, und auch, dass Sie peut Sie verwenden sie in HAVING, weshalb Sie versuchen, HAVING anstelle von WHERE zu verwenden. Um das zu tun, müssen Sie die Abfrage in eine GROUP BY-Abfrage umschreiben:

SELECT campgroundid, name, private, wifi, 
   ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
    AS distance 
FROM campground 
GROUP BY campgroundid 
HAVING distance < 25 AND type='private' AND wifi = 1
ORDER BY distance LIMIT 0 , 20;

Dies funktioniert, solange campgroundid eindeutig ist (da die anderen Werte dann aus dem einzigen Datensatz für diese ID stammen).

0voto

SilverbackNet Punkte 2039

Es sieht so aus, als sollte es sein WHERE distance < 25 wie HAVING für Abfragen wie HAVING MAX(distance) < 25 und andere aggregierte Funktionen.

0voto

ajreal Punkte 45851

Ich denke, dies ist einen Versuch wert (so einfach wie die Where-Klausel von der zweiten Sql in die erste hinzufügen)

SELECT 
  ... AS distance 
FROM campground 
WHERE type='private' AND wifi = 1
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

0voto

Bhaskar Punkte 1

SELECT campgroundid, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS Entfernung FROM campingplatz WHERE type='privat' AND wifi = 1 ORDER BY Entfernung LIMIT 0 , 20 HAVING Entfernung < 25

das könnte funktionieren

-1voto

siddhusingh Punkte 1732

Wenn Ihre Frage ist, WHERE-Klausel aus zwei Tabellen mit einer JOIN-Logik haben. Dann müssen Sie diesen Wert in die SELECT-Liste aufnehmen. Z.B., SELECT USER.UserName, USER.UserId, LOC.id, LOC.lat, LOC.lon, ( 3959 * acos( cos( radians('123.1210022') ) * cos( radians( lat ) ) * cos( radians( lon ) - radians('21.200001') ) + sin( radians('123.1210022') ) * sin( radians( lat ) ) ) ) AS Abstand FROM benutzerstandort LOC, benutzer USER HAVING Abstand < '1' AND LOC.id = USER.UserId ORDER BY Abstand LIMIT 0 , 20

Wenn Sie USER.UserId in der Select-Liste vermissen, können Sie LOC.id = USER.UserId in der WHERE-Klausel nicht verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X