Vinzenz Mai: Reihenfolge bei JOIN festlegen

Beitrag lesen

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