(MySql) Sprachauswahl mit Fallback


#1
Hallo zusammen,
ich suche gerade einen Denkanstoß für folgendes Szenario:

Haupttabelle: Artikel
Join-Tabelle: Inhalt

Jetzt habe ich eine Sprachauswahl, und es sollen mir alle Artikel in der ausgewählten Sprache angezeigt werden, und wenn es diese Sprache nicht gibt, möchte ich gerne die Fallback (Standard)-Sprache haben.

Select Artikel
Join Inhalt
Where Inhalt.Artikel_id = Artikel.id
Where Inhalt.Sprache = aktuelle Sprachauswahl-ID

Wenn es das kein Ergebnis gibt, soll eine Fallback-Abfrage integriert werden, die dann das Where der Sprachabfrage folgendermaßen abändert:

Where Inhalt.Sprache = Standard Sprach-ID


----------

Ich würde nur gerne alles in einer SQL Abfrage haben und keine Foreach-Geschichte mit mehreren Datenbankanfragen.
Habe schon über Case - Where IF Else Geschichten gedacht, aber noch keine funktionierende Lösung hinbekommen.

Ideen?

Liebe Grüße und schonmal vielen Dank,
Michael
 

Yaslaw

n/a
Moderator
#2
Jepp, tricki. Aber es geht: Mein Test bei SQLFiddle

Ich habe als erstes eine Abfrage zusammengestellt, in der die Sprachen priorisiert sind. Je höher die Prio, umso wichtiger die Sprache. In dem Fall ist D die ausgewählte Sprache und E die Standardsprache
SQL:
create or replace view v_sprachen as 
select 'D' as sid, 10 as prio
union all select 'E' as sid, 1 as prio;
Darauf aufbauend ein SQL, dass die Sprache pro Inhalt ermittelt.
Die Logik dahinter ist aus dem SQL-Handbuch: MySQL :: MySQL 5.1 Referenzhandbuch :: 3.6.4 Die Zeilen, die das gruppenweise Maximum eines bestimmten Felds enthalten
SQL:
select i_1.aid, i_1.sid
  from inhalt i_1 inner join v_sprachen s_1 on i_1.sid = s_1.sid
  where s_1.prio = (
    select max(s_0.prio)
    from inhalt i_0 inner join v_sprachen s_0 on i_0.sid = s_0.sid
    where i_0.aid = i_1.aid
   );