Onkel Theo: Reihenfolge bei JOIN festlegen

Hallo,

ich teste gerade die dritte Sprache für einen Lager- Artikel. Die Seite wertet die erste Sprache von $_SERVER['HTTP_ACCEPT_LANGUAGE'] aus.

Testfall:
In der Tabelle "artikel" ist die Beschreibung de. Die Tabelle "uebersetzungen" enthält en und zh.

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' ))

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?

Gruß, Onkel Theo

  1. Die Frage könnte auch sein:

    Kennt MySQL ein "Entweder- oder OR" mit Reihenfolge anstatt dem "Sowohl als auch OR" ?

  2. Tach,

    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?

    die übliche Lösung wäre sich nur den sprachpassenden Datensatz zurückgeben zu lassen, dein SQL-Statement muß also im Sprachstring variabel sein. In Pseudocode mit $sprache als vom User übergebene Sprache:

    if ($sprache != "zh"){
      $sprache="en";
    }

    $sql = "LEFT JOIN  uebersetzungen ueb1 ON (ueb1.tabelle = 'artikel' AND ueb1.tabelle_id = artikel.id
    AND ueb1.sprache = '" + $sprache + "'";

    Statt des if am Anfang kannst du auch direkt den Userstring nutzen, sofern du ihn vorher passend zum Kontext behandelst, um dir keine SQL-Injection-Lücke einzuhandeln.

    mfg
    Woodfighter

  3. 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.

    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>,     [COALESCE](http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#function_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