Reihenfolge bei JOIN festlegen
Onkel Theo
- datenbank
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
Die Frage könnte auch sein:
Kennt MySQL ein "Entweder- oder OR" mit Reihenfolge anstatt dem "Sowohl als auch OR" ?
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
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