Hallo Ilja!
Danke für die Antwort.
SELECT bi.osname,bi.pxhoehe,bi.pxbreite,bitxt.alttag,bitxt.title,s.Kuerzel FROM Bilder as bi LEFT JOIN Bildertexte as bitxt ON (bi.PicNr = bitxt.BildNr) INNER JOIN Sprachen AS s ON (bitxt.Sprache = s.LangNr) WHERE bi.osname ='x96.gif' AND (s.Kuerzel = 'EN')
der Outer Joins ist nur notwendig notwendig, wenn es zu einem bild keine entsprechenden bildertext gibt, ...
Ja das kann sein, ein Bild kann keine Entsprechung in Texte haben, oder eine, oder mehrere (für mehrere Sprachen).
was ich aber an deinen tabellen auf den ersten blick nicht herleiten kann.
Ich hoffe jetzt besser darzustellen:
Tabelle Bilder Tabelle Bildertexte Tabelle Sprachen
ID osname pxhoehe ID Text Sprache ID Kuerzel
------------------------- ------------------------------- ----------------
1 Kuh.jpg 400 1 Das ist eine Kuh 1 1 DE
2 Hund.jpg 450 1 This is a cow 2 2 EN
3 Schwein.jpg 500 3 Das ist ein Schwein 1
4 Gans 600 4 This is a goose 2
damit wird dein problem der zweite INNER JOIN sein. wenn du erst einen LEFT JOIN machst, werden eventuell NULL werte eingesetzt. und diese NULL werte werden auch bei einem INNER JOIN nie auf gleichheit teffen.
Stimmt, egal ob der erste Join ein LEFT ist oder nicht, ich bekomme immer nur jene Bilder die mindestens eine Zeile in Bildertexte haben.
Weil eben - wie Du sagst - die Nullwerte aus Bildertexte nie eine Entprechung in der Tabelle Sprache finden.
Nur, wie soll ich das lösen? Ich versuchte eben ohne Erfolg das Problem mit den nicht vorhandenen Bildertexten so in den Griff zu bekommen:
$sql="SELECT bi.osname,bi.pxhoehe,bi.pxbreite,bitxt.alttag,bitxt.title,s.Kuerzel FROM Bilder as bi LEFT JOIN Bildertexte as bitxt ON (bi.PicNr = bitxt.BildNr) LEFT JOIN Sprachen AS s ON (bitxt.Sprache = s.LangNr) WHERE bi.osname ='" . $osname . "' AND (s.Kuerzel = '" . $lang . "' OR isnull(bitxt.PicID))";
So richtig weiß ich nicht, ob und wo ich isnull einsetzen soll, denn natürlich will ich das Bild jedenfalls haben, egal ob mit oder ohne Text.
Leider ohne Erfolg ....
Beste Grüße
Viennamade