mehrere JOINs in ein Feld

JBJHJM

Mitglied
Achtung, der Titel beschreibt mein Problem mehr schlecht als recht. Das ist leider nicht kurz zu formulieren.

Ich stells mal so einfach wie möglich dar:
Ich habe die tabellen
'images' - columns 'imgid', 'imgname'
und
'imageinfo' - columns 'imgid','language', 'info'

language kann englisch oder deutsch sein. Standard ist englisch, doch wenn der User deutsch eingestellt hat, wird die info, soweit vorhanden, auf deutsch dargestellt. Daher war meine erste überlegung, die imageinfo-tabelle doppelt zu joinen, zuerst mit der Standardsprache, und dann mit der Wunschsprache - ins selbe feld, sodass ich mich danach nur noch das Feld 'info' auslesen muss.
Doch da komme ich leider an meine Grenzen - wenn ein User auf deutsch gestellt hat, und der eintrag auf deutsch nicht definiert ist, wird der englische info-eintrag mit null überschrieben.
Statt des ganzen Textes dürfte ein Beispiel mehr Licht in die Sache bringen:

Code:
SELECT 
img.imgname,
i1.info AS info,
i2.info AS info 
FROM images AS img 
LEFT JOIN imginfo AS i1 
ON (i1.imgid = img.imgid AND i1.language="en") 
LEFT JOIN imginfo AS i2 
ON (i2.imgid = img.imgid AND i2.language="de") 
LIMIT 1

Dass es so nicht funktionieren kann erklärt sich von selbst, klar dass im Ergebnis der Info-Wert immer von i2 definiert wird. Aber ich möchte gerne, dass i2 den Wert von i1 nur überschreibt, wenn i2 etwas gefunden hat!
Irgendjemand eine Idee ob - und wie - das zu bewerkstelligen ist?
Vielen Danke für jede Hilfe schonmal!
 
Habe gerade möglicherweise eine Lösung gefunden - "Control Flow Functions" - damit müsste es eigentlich gehen. Aber obs nicht einfacher geht? ...

Benutze nun
IFNULL(i2.info, i1.info) AS info
Das funktioniert, aber falls jemand andere Lösungen kennt, würde ich diese sehr gerne hören/lesen!
 
Zuletzt bearbeitet:
SQL:
IFNULL(i2.info, i1.info) AS info

Wenn ich das richtig sehe wird dir die Funktion immer die deutsche Übersetzung liefern sobald sie vorhanden ist. Es würde die Englische Version immer überschreiben.
 
SQL:
IFNULL(i2.info, i1.info) AS info

Wenn ich das richtig sehe wird dir die Funktion immer die deutsche Übersetzung liefern sobald sie vorhanden ist. Es würde die Englische Version immer überschreiben.

Das ist auch richtig so.
Die zuordnung deutsch/englisch war auch nur zur einfachen Darstellung. Tatsächlich ist sowohl die Abfrage als auch naja... das ganze System wesentlich komplexer.

Um es kurz zu verdeutlichen - i1 ist die Standardsprache, i2 die vom User definierte Sprache. Insorfern diese vorhanden ist, wird letztere bevorzugt ;)
 

Neue Beiträge

Zurück