Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Join funktioniert nicht

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von marcel91, 21 März 2017.

  1. marcel91

    marcel91 Benutzer

    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.png Store.png
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  3. marcel91

    marcel91 Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ja, was denn nun? enn Du der Tabelle Store den Alias s vergibst, so solltest Du diesen dann auch nutzen. Davin ist in Deinem Select aber nix zu sehen.
     
  5. ukulele

    ukulele Datenbank-Guru

    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.
     
  6. marcel91

    marcel91 Benutzer

    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.
     
  7. marcel91

    marcel91 Benutzer

    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?
     
  8. ukulele

    ukulele Datenbank-Guru

    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.
     
  9. marcel91

    marcel91 Benutzer

    Ja stimmt, mit s.`name` klappte es auch, danke!
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden