Hallo,
Die Projektsprache ist en
Wenn ein Besucher nun nl oder pl verlangt, wird das nicht gefunden und en ausgeliefert. So weit okay.
Wenn ein Besucher aber mit zh kommt, wird auch en ausgeliefert, obwohl zh vorhanden. Die Übersetzung hole ich mit einem JOIN dazu:
LEFT JOIN uebersetzungen ueb1
ON (ueb1.tabelle = 'artikel'
AND ueb1.tabelle_id = artikel.id
AND (ueb1.sprache = 'zh'
OR ueb1.sprache = 'en' ))
das ist falsch. Selbstverständlich darfst Du 'en' nicht dazu-odern. Das ist Dein Fallback.
> Mir ist klar, dass zwei Datensätze gefunden werden, ich lese aber nur den ersten. Der hat eben zufällig die Eigenschaft "en". Ich hätte aber gerne den "zh" zuerst. Kann ich das im JOIN klären?
ja, selbstverständlich. Das ist genau ein Fall für einen LEFT JOIN mit Einschränkung in der JOIN-Bedingung. Zusätzlich nimmst Du die Funktion COALESCE um den Fallback auf Englisch vorzunehmen. Du dar
Die Auswirkungen von SQL-Statements erklärt man übrigens am besten an Beispieldaten, nicht anhand fehlerhafter Statements.
~~~sql
SELECT
<sonstige spalten>,
ueb1.sprache
FROM
artikel a
LEFT JOIN
uebersetzungen ueb1
ON
a.id = ueb1.tabelle_id
AND
ueb1.tabelle = 'artikel'
AND
ueb1.sprache = 'gewünschte Sprache'
Ist die gewünschte Sprache nicht verfügbar, so enthält die Spalte ueb1.sprache den speziellen Wert NULL. Um in diesem Fall den Fallback zu bekommen, nutzt Du die Funktion COALESCE(), die den ersten von NULL verschiedenen Wert zurückgibt:
SELECT
<sonstige spalten>,
[link:http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_coalesce@title=COALESCE](ueb1.sprache, 'en')
FROM
artikel a
LEFT JOIN
uebersetzungen ueb1
ON
a.id = ueb1.tabelle_id
AND
uêb1.tabelle = 'artikel'
AND
ueb1.sprache = 'gewünschte Sprache'
Somit erhältst Du die bevorzugte Sprache bzw. Englisch, wenn die bevorzugte Sprache nicht vorhanden ist. Selbstverständlich ist die Benutzereingabe kontextgerecht zu behandeln.
Freundliche Grüße
Vinzenz