Viennamade: Ersatz für Subselect

Beitrag lesen

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