LEFT JOIN bei verschiedenen MySQL-Versionen

Ceppi

Erfahrenes Mitglied
Hallo,

innerhalb meiner PHP-Seite möchte ich gleichzeitig Daten aus zwei Tabellen holen, die miteinander verknüpft sind.

Folgende Tabellenstruktur:

user:
id | name | gruppe

testergebnisse
id | testid | userid | ergebnis

Das Problem dabei: Es sollen alle Datensätze der Tabelle "user" ausgegeben werden, die einen über userid verknüpften oder keinen Datensatz in "testergebnisse" mit einer bestimmten testid haben.

Mein Query:
Code:
SELECT 
   user.name,testergebnisse.ergebnis
FROM
   user
LEFT JOIN
   testergebnisse
ON
  user.id=testergebnisse.userid
WHERE
  user.gruppe IN('abc','xy') AND (testergebnisse.testid='123' OR ISNULL(testergebnisse.testid))
Getestet habe ich es mit EasyPHP (MySQL 4.1.9), wobei alles so funktioniert wie gedacht: Es werden auch die Datensätze angezeigt, die einen Eintrag in "testergebnisse.testid"!="123" haben (mit NULL als Wert in den jeweiligen Feldern).

Auf dem Server (MySQL 3.22.25) werden mir aber jene Datensätze aus "user" nicht mehr angezeigt, zu denen es einen Datensatz mit "testid"!="123" in "testergebnisse" gibt.
Wenn man es sich überlegt, ist das ja auch logisch, nur warum funktioniert's mit der neueren Version? Kann das an der "Left-Join-Optimierung" von MySQL liegen? Und kann man es mit einer alten Version von MySQL irgendwie anders schreiben?

Ceppi
 
Noch mal zur Verdeutlichung meines Problems:

Ausgabetabelle unter MySQL 4.1.9:
Code:
id name ergebnis testid
1  Bert   NULL     NULL
2  Marie NULL     NULL
3  TestA 2.1        123

Und unter MySQL 3.22.25:
Code:
id name ergebnis testid
2  Marie NULL     NULL
3  TestA 2.1        123

Außerdem befinden sich in der Tabelle "testergebnisse" z.B. folgende Einträge:
Code:
id testid userid ergebnis
1  45     1        10
Der User "Bert" hat also einen Eintrag in der Tabelle "testergebnisse" mit einer anderen "testid". Wie kann ich den Query verändern, so dass ich die obere Ergebnistabelle erhalte?

Ceppi
 
Bist Du Dir sicher, dass Du dieselbe Abfrage und dieselben Daten in der Version 4.1.9 verwendest?
In Version 4.1.14 ergibt das Query nämlich die gleichen Daten, wie bei Dir in der 3er-Version:
Code:
mysql> select * from user;
+----+-------+--------+
| id | name  | gruppe |
+----+-------+--------+
|  1 | Bert  | abc    |
|  2 | Marie | abc    |
|  3 | TestA | abc    |
+----+-------+--------+
3 rows in set (0.00 sec)

mysql> select * from ergebnisse;
+----+--------+--------+----------+
| id | testid | userid | ergebnis |
+----+--------+--------+----------+
|  1 |     45 |      1 |        9 |
|  2 |    123 |      3 |        2 |
+----+--------+--------+----------+
2 rows in set (0.00 sec)

mysql> select
    ->   user.name,
    ->   ergebnisse.ergebnis
    -> from user
    -> left join ergebnisse
    ->   on user.id=ergebnisse.userid
    -> where user.gruppe in ('abc','xy')
    ->   and (ergebnisse.testid=123
    ->     or ISNULL(ergebnisse.testid));
+-------+----------+
| name  | ergebnis |
+-------+----------+
| Marie |     NULL |
| TestA |        2 |
+-------+----------+
2 rows in set (0.00 sec)
Eine mögliche Lösung ist es, die Bedingung in die ON-Bedingung des LEFT JOIN zu nehmen:
Code:
mysql> select
    ->   user.name,
    ->   ergebnisse.ergebnis
    -> from user
    -> left join ergebnisse
    ->   on user.id=ergebnisse.userid
    ->     and ergebnisse.testid=123
    -> where user.gruppe in ('abc','xy');
+-------+----------+
| name  | ergebnis |
+-------+----------+
| Bert  |     NULL |
| Marie |     NULL |
| TestA |        2 |
+-------+----------+
3 rows in set (0.00 sec)
Gruß hpvw
 
Hallo hpvw,

danke für deine Hilfe. Durch die Änderung des ON-Statements funktioniert nun alles wie geplant. Ich hab mich ja auch schon selber gewundert, wieso mit einer MySQL-Version so ein (nicht unbedingt logisches) Ergebnis herauskam - vielleicht hab ich mich auch vertan und ein großes Brett vor'm Kopf :)

Ceppi
 
Zurück