2017-12-18 8 views
0

Ich versuche, * aus der users2 Tabelle zu erhalten, wo der Standort des Benutzers innerhalb des angegebenen Radius ist.Verknüpfen Sie zwei Tabellen Unterabfrage

Die Standortabfrage funktioniert problemlos in der Tabelle user_location2.

SELECT uid, (3959 * acos(cos(radians(28.247800068217)) * cos(radians(`lat`)) * cos(radians(`lon`) - radians(-80.726205977101)) 
+ sin(radians(28.247800068217)) * sin(radians(`lat`)))) 
AS distance FROM user_location2 
HAVING distance <= 25 ORDER BY time_stamp 

und die innere Verknüpfung funktioniert gut ohne die Standortunterabfrage

SELECT * 
FROM users2 
LEFT JOIN user_location2 
ON user_location2.uid = users2.id 

Ich bin nur Probleme, die Kombination der beiden. Hier ist meine aktuelle Abfrage, die nur alle Zeilen zurückgibt, also mache ich offensichtlich etwas falsch.

SELECT * 
FROM users2 
LEFT JOIN user_location2 
    ON user_location2.uid = users2.id 
WHERE EXISTS (SELECT NULL, (3959 * acos(cos(radians(26.247800068217)) * cos(radians(`lat`)) * cos(radians(`lon`) - radians(-89.726205977101)) + sin(radians(26.247800068217)) * sin(radians(`lat`)))) 
AS distance FROM user_location2 
HAVING distance <= 5 ORDER BY time_stamp) 

bearbeiten enthielt

Ich hoffe, in einer dritten Tabelle hinzuzufügen (user_like) eine Menge von möglichen Zeilen zu beseitigen, die im Ergebnis nicht enthalten sein sollten.

Lassen Sie sich sagen, dass das Skript für user_id läuft = 88

Here's a screenshot of the table state

Also im Grunde 89 Benutzer, 90 und 91 unter dem Ortsradius fallen würden, würde aber im Ergebnis nicht enthalten sein, da 88 Benutzer hat sie schon gemocht.

Antwort

0

Try this ...

SELECT users2.* 
FROM users2 
LEFT JOIN user_location2 
ON user_location2.uid = users2.id 
WHERE (3959 * acos(cos(radians(28.247800068217)) * cos(radians(`lat`)) * cos(radians(`lon`) - radians(-80.726205977101)) 
+ sin(radians(28.247800068217)) * sin(radians(`lat`)))) < = 5 
ORDER BY time_stamp 

Die Verbindung zwischen den beiden Tabellen in Ordnung. Die berechnete Spalte wurde in der SELECT-Klausel und der WHERE-Klausel hinzugefügt, da der Filter sie dort benötigt. Es wäre einfacher, dies durch eine Ansicht zu sehen, so dass, wenn Sie es ändern müssen, es an einer Stelle erfolgen kann.

BEARBEITEN: Entfernte die Berechnung von SELECT, weil ich glaube, dass Sie das nicht sehen müssen. Lassen Sie es einfach in der WHERE-Klausel, da es gefiltert werden muss.

+0

, die groß ist! Scheint gut zu funktionieren. Ist es möglich, ein paar WHERE-Klauseln von users2 darauf zu werfen? wie WHERE users2.age> 25 –

+1

Ja. Fügen Sie sie einfach vor oder nach der Bedingung hinzu und verwenden Sie AND oder OR nach Bedarf. – clinomaniac

+0

Können Sie meine bearbeitete Frage überprüfen, wenn Sie eine Chance haben? Ich würde es wirklich schätzen. –

0

Sie können dies versuchen:

SELECT * 
FROM users2 A 
LEFT JOIN user_location2 B 
    ON B.uid = A.id 
    WHERE (3959 * acos(cos(radians(26.247800068217)) * cos(radians( `B.lat`)) * cos(radians(`B.lon`) - radians(-89.726205977101)) + sin(radians(26.247800068217)) * sin(radians(`B.lat`)))) > 25; 
+0

danke für die Antwort. Ich hatte einige gemischte Ergebnisse mit diesem. Die Abfrage hat einige falsche Zeilen aus dem Standortradius zurückgegeben. –

+0

Es wird hilfreich sein, wenn Sie das korrekte und falsche Ergebnis anzeigen und Sie können mehr Bedingung setzen, um das richtige Ergebnis zu erhalten. –

Verwandte Themen