Join funktioniert nicht

marcel91

Benutzer
Beiträge
5
Hallo zusammen,

ich bin neu in mySQL und PHP und versuche gerade einen Webservice für eine App zu erstellen. Ich habe folgenden Code:

$query = sprintf("SELECT cut.id, s.id, latitude, longitude, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude )
- radians('%s') ) + sin(radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
FROM(SELECT id, latitude, longitude FROM Location WHERE latitude Between '%s' AND '%s' AND longitude Between '%s' AND '%s') AS cut
LEFT JOIN Store s ON s.id = cut.storeID
WHERE 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude )
- radians('%s') ) + sin(radians('%s') ) * sin( radians( latitude ) ) ) < '%s' ORDER BY distance",
mysqli_real_escape_string($link, $userLatitude),
mysqli_real_escape_string($link, $userLongitude),
mysqli_real_escape_string($link, $userLatitude),
mysqli_real_escape_string($link, $minLat),
mysqli_real_escape_string($link, $maxLat),
mysqli_real_escape_string($link, $minLon),
mysqli_real_escape_string($link, $maxLon),
mysqli_real_escape_string($link, $userLatitude),
mysqli_real_escape_string($link, $userLongitude),
mysqli_real_escape_string($link, $userLatitude),
mysqli_real_escape_string($link, $radius));

Das alles funktioniert sehr gut wenn ich den JOIN rausnehme, ich brauche aber den JOIN, da ich zu meinen Locations auch die Stores anzeigen möchte. Wenn ich das ausführe bekomme ich folgende Fehlermeldung:
Unknown column 'cut.storeID' in 'on clause'
Ich bin mir jedoch ganz sicher, das ich die Spalte storeID in der Tabelle Location habe.
Wenn ich im JOIN auf andere Attribute der Tabelle Location zugreifen will, gibt es keine Fehlermeldung. Weiß jemand woran das liegen könnte? Wie gesagt ich bin neu in SQL und habe das Problem schon seid ein paar Tagen nicht lösen können. Ich wäre für jede Hilfe sehr dankbar. Das sind meine Tabellen:Location.pngStore.png
 
Werbung:
Deine Tabelle cut ist wie folgt definiert:

Code:
... FROM(SELECT id, latitude, longitude FROM Location WHERE latitude Between '%s' AND '%s' AND longitude Between '%s' AND '%s') AS cut

Da ist kein storeID.

Btw.: mit PostgreSQL/PostGIS httest Du eine indexbasierte Umkreissuche, die locker Faktor 10000 schneller wäre.
 
Vielen Dank! Die Variable wird jetzt erkannt.
Ich stehe jetzt jedoch vor einem weiteren Problem. Wenn ich im ersten SELECT statement `Store.name` bzw. `s.name` aufrufe, erhalte ich wieder:
Unknown column 'Store.name' in 'field list'
Ich verstehe noch nicht so richtig, weshalb die Spalten nicht erkannt werden.
Ich würde gerne ein Array mit Store.name, cut.latitude und cut.longitude erstellen.
Hättest du auch hierfür eine Lösung?

Danke für den Tipp mit der PostgreSQL, werde ich mir am Wochenende auf jeden Fall mal anschauen.
 
Es kommt nicht darauf an welche Spalten deine Tabelle "Location" hat sondern welche Spalten dein Subselect auf "Location" alias "cut" liefert. Nur die Spalten die im Select auf Location auch ausgewählt werden kannst du dann auch mit einbeziehen.
 
Erstmal danke für die schnellen Antworten.
Das die Spalten zuerst über SELECT ausgewählt werden müssen, damit diese erkannt werden habe ich jetzt verstanden. Ich habe jetzt folgenden Code:

sprintf("SELECT cut.id, `s.name`, latitude, longitude, ( 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude )
- radians('%s') ) + sin(radians('%s') ) * sin( radians( latitude ) ) ) ) AS distance
FROM(SELECT id, latitude, longitude, storeID FROM Location WHERE latitude Between '%s' AND '%s' AND longitude Between '%s' AND '%s') AS cut
LEFT JOIN Store s ON s.id = cut.storeID
WHERE 6371 * acos( cos( radians('%s') ) * cos( radians( latitude ) ) * cos( radians( longitude )
- radians('%s') ) + sin(radians('%s') ) * sin( radians( latitude ) ) ) < '%s' ORDER BY distance",

Ich habe also jetzt im ersten SELECT statement `s.name` eingefügt, bekomme aber den Fehler:
Unknown column 'Store.name' in 'field list'
Sollte s.name nicht verfügbar sein, wenn ich Store s im JOIN statement erwähne?
Bei den Beispielen die ich auf Google gefunden habe, funktioniert es auf diese Weise.
 
Es funktioniert jetzt! ich habe anstatt `s.name` nur `name` geschrieben und es hat geklappt. Aber wieso klappt es auf diese Weise? Sollte es nicht auch klappen wenn ich `s.name` verwende?
 
Also ich mag die MySQL Quotes nicht aber ich glaube es müsste korrekt s.`name` heißen oder eben einfach s.name. `s.name` müsste wirklich das s. Bestandteil des Spaltennamens in Store sein.
 
Werbung:
Zurück
Oben