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

mySQL - LEFT JOIN Problem

Dieses Thema im Forum "PHP & Co." wurde erstellt von Datschi, 17.07.07.

  1. Datschi

    Datschi Reinette de Champagne

    Dabei seit:
    08.11.04
    Beiträge:
    417
    Hi Ihr.
    Ich hab mal wieder nen Problem.

    Und zwar hab ich meine zwei Tabellen. Die eine hält Tourpunkte (sprachunabhängig) und die andere die Sprachabhängigen Daten dazu. So, dass die Tourpunkte und ihre Informationen in verschiedenen Sprachen vorliegen können.
    Ein einfacher LEFT JOIN zwischen den zwei Tabellen wäre ja kein Problem.
    Auch nicht mit Auswahl von Attributen. Allerdings benötige ich eine zusätzliche Selektion.
    Es sollen aus allen Tourpunkten nur die zu einer bestimmten Tour zugehörigen ausgewählt werden.
    Ich brauche also alle Tourpunkte aus Tour 3 und die dazugehörigen Sprachabhängigen Daten in wahlweise Deutsch oder Englisch. Die Auswahl der Tour und Sprache passiert über HTML/PHP-Variablen und stellt kein Problem dar.
    Der folgene SQL-String funktioniert zwar, wenn in beiden Tabellen Daten vorhanden sind, jedoch nicht, wenn keine Sprachabhängigen Daten zu den Tourpunkten vorliegen.
    Ich möchte aber auf jeden Fall ein Ergebnis. Es reicht auch, wenn nur die Tourpunkt-Attribute ohne sprachabhänige Daten angezeigt werden.
    Code:
    $get_tour_checkpoints_sql = 'SELECT checkpoints.*, tourdata.* 
    FROM '.$kfz.'_'.$city_name.'_checkpoints AS checkpoints 
    JOIN '.$kfz.'_'.$city_name.'_lang_dep_checkpoint_data 
    AS tourdata 
    WHERE 
    `checkpoints`.`t_id` = '.$_POST['t_id'].' 
    AND `tourdata`.`t_id` = '.$_POST['t_id'].' 
    AND `checkpoints`.`tp_id` = `tourdata`.`tp_id`;';
    
    Ich hoffe, ich habe mein Problem halbwegs verständlich auseinandergesetzt und ihr könnt mir helfen!
    Danke schonmal!
    lg, Datschi
     
  2. Ijon Tichy

    Ijon Tichy Stina Lohmann

    Dabei seit:
    21.11.06
    Beiträge:
    1.045
    Vorausgesetzt ich habe das richtig verstanden:

    Was du brauchst ist ein LEFT OUTER JOIN. D.h. die Daten der linken Tabellen werden auch dann geliefert, wenn es keinen Match zur rechten gab. Das ist der Fall, wenn tourdata.tp_id NULL ist. Im übrigen würde ich bei JOIN immer die ON-Klausel für die JOIN-Bedingung verwenden, weil das leserlicher ist - für den OUTER JOIN ist es notwendig, weil sonst Selektion und Join-Bedingung nicht klar getrennt sind und nicht ermittelt werden kann, wo die Nullwerte zulässig sind.

    Also:

    $get_tour_checkpoints_sql = 'SELECT checkpoints.*, tourdata.*
    FROM '.$kfz.'_'.$city_name.'_checkpoints AS checkpoints
    LEFT OUTER JOIN '.$kfz.'_'.$city_name.'_lang_dep_checkpoint_data
    AS tourdata
    ON `checkpoints`.`tp_id` = `tourdata`.`tp_id`
    WHERE
    `checkpoints`.`t_id` = '.$_POST['t_id'].' ;


    Falls (je nach SQL-Version) LEFT OUTER JOIN nicht unterstützt, musst du in der WHERE-Bedingung eben auch NULL-Werte für tourdata.tp_id zulassen.

    HTH
     
  3. Datschi

    Datschi Reinette de Champagne

    Dabei seit:
    08.11.04
    Beiträge:
    417
    Danke erstmal.
    Ich werd das gleich mal ausprobieren.
    Werde dann Rückmeldung geben...
     
  4. Datschi

    Datschi Reinette de Champagne

    Dabei seit:
    08.11.04
    Beiträge:
    417
    Schaut gut aus! Ich bekomm das, was ich beabsichtigt habe! Vielen Danke!!!
     

Diese Seite empfehlen