Moin,
ich habe eine multilinguale Webseite, bei der aber nicht unbedingt alle Inhalte in alle Sprachen übersetzt sein müssen. Wenn eine Übersetzung fehlt, soll zuerst die in die als international deklariere Sprache Übersetzung, dann irgendeine andere ausgewählt werden.
Die Inhalte sind in einer Tabelle namens
strings (jeder String hat eine ID) aufgelistet, die Übersetzungen in
translations, die die String-ID und eine Sprach-ID enthält.
Da ich alle Strings haben möchte, verwende ich zuerst folgende Query:
SQL-Anweisung
1: 2:
| SELECT strings.id FROM strings |
Um nun an die Übersetzungen zu kommen, verwende ich derzeit eine Subquery:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| SELECT strings.id, ( SELECT translations.value FROM translations WHERE strings.id = translation.stringID ORDER BY translation.languageID = 3 DESC, translation.languageID = 2 DESC LIMIT 0,1 ) AS value FROM strings |
Wobei
languageID 3 die aktive Sprache und
2 die internationale ist.
Da dieses Schema aber sehr häufig vorkommt, möchte ich von einer Subquery absehen und das ganze lieber mit JOINS realisieren. Ein Ansatz dafür ist:
SQL-Anweisung
1: 2: 3: 4: 5: 6: 7:
| SELECT strings.id, translations.value FROM strings LEFT JOIN translations ON translations.stringID = strings.id ORDER BY translation.languageID = 3 DESC, translation.languageID = 2 DESC |
Jetzt muss ich nur noch doppelte Strings entfernen. Weiß jemand, wie das in diesem Fall geht?
DISTINCT funktioniert nur, wenn ich
translation.value aus der
SELECT-Klausel entferne - und die Spalte brauche ich natürlich unbedingt.
GROUP BY wäre auch noch eine Idee, aber das entfernt doppelte Strings aus,
bevor nach Sprache sortiert wird, und dann wird per Zufall entschieden, welche Sprache ausgewählt wird.
Danke für eure Mühe!
Grüße,
Yogu