• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

mySQL - LEFT JOIN Problem

Datschi

Reinette de Champagne
Registriert
08.11.04
Beiträge
415
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
 

Ijon Tichy

Clairgeau
Registriert
21.11.06
Beiträge
3.689
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
 

Datschi

Reinette de Champagne
Registriert
08.11.04
Beiträge
415
Danke erstmal.
Ich werd das gleich mal ausprobieren.
Werde dann Rückmeldung geben...
 

Datschi

Reinette de Champagne
Registriert
08.11.04
Beiträge
415
Schaut gut aus! Ich bekomm das, was ich beabsichtigt habe! Vielen Danke!!!