mysql abfrage / alternativen angeben
jens65m
- datenbank
hallo,
sagen wir mal ich habe folgende tabellen:
tab1
id | var1 | var2
----------------
1 | xy | yz
----------------
2 | ab | cd
tab2
id | tab1-id | lang | var3
--------------------------
1 | 1 | de | xx
--------------------------
2 | 1 | en | ff
--------------------------
3 | 2 | en | gg
und ich nutze diese Abfrage:
SELECT tab1.var1, tab1.var2, tab2.var3
FROM tab1
INNER JOIN tab2
ON tab1.id = tab2.tab1-id
WHERE tab2.lang = 'de';
Wie kann ich etwas derart hinbekommen?
Hab leider nichts dazu gefunden:
SELECT tab1.var1, tab1.var2, tab2.var3
FROM tab1
INNER JOIN tab2
ON tab1.id = tab2.tab1-id
WHERE tab2.lang = 'de'
OR (wenn 'de' nicht verfügbar) tab2.lang = 'en';
Was in Klammern steht weiß ich leider nicht umzuseten?!
LG, Jens
SELECT tab1.var1, tab1.var2, tab2.var3
FROM tab1
INNER JOIN tab2
ON tab1.id = tab2.tab1-id
WHERE tab2.lang = 'de'
OR (wenn 'de' nicht verfügbar) tab2.lang = 'en';
>
> Was in Klammern steht weiß ich leider nicht umzuseten?!
> LG, Jens
Von der Idee (hab ich nicht ausgetestet):
~~~sql
SELECT
tab1.var1,
tab1.var2,
if(de.var3 NOT NULL, de.var3, en.var3) var3
FROM
tab1,
tab2 de,
tab2 en
WHERE
(tab1.id = de.tab1-id AND de.lang = 'de')
OR (tab1.id = en.tab1-id AND en.lang = 'en')
Die if-Zeile bewirkt, dass "de" Vorrang hat, sonst wird "en" genommen.
Atomi
Also tut mir leid. Ich kriegs einfach nicht gebacken.
Mittlerweile hab ich folgendes probiert:
SELECT a.type, a.href, a.target, b.text
FROM menu_item AS a
INNER JOIN tab_translate AS b
ON (a.id = b.aid)
WHERE (a.var = '1')
AND (b.type = 'menu_item')
AND (b.lang = 'en')
Nun weiß ich nicht wie ich die letzte Zeile ändern muss, damit 'en' verwendet wird wenns verfügbar ist und wenn nicht 'de' gesucht wird.
Um nochmal genauer darauf einzugehen.
menu_item:
(id, menu_id, href, target)
--
translate:
(id, type, cid, lang, text)
--
Die Tabelle "menu_item" beinhaltet alle Links.
Die Labels der Links werden in der Tabelle "translate" gepspeichert.
Bsp.:
menu_item:
(1, 1, http://www.example.com, 0)
translate:
(1, menu_item, 1, de, Beispiel)
(2, menu_item, 1, en, Beispiel)
Verbunden sind die beiden Tabellen über (menu_item.id = translate.cid).
Ich möchte jetzt also Abfrage:
SELECT a.href, a.target, b.text
FROM menu_item AS a
INNER JOIN translate AS b
ON a.id = b.cid
WHERE (a.menu_id = '1')
AND (b.type = 'menu_item')
AND (PREFER b.lang = 'en' OR b.lang = 'de')
Wobei PREFER natürlich nicht funktioniert und nur dazu dient um mein Problem zu verstehen.
Heißt also, es sollen alle Menüpunkte abgefragt werden allerdings nur einmal! und dann soll versucht werden das Englische Label zu laden, ist dies nicht möglich soll das Deutsch verwendet werden. Auf biegen und brechen hab ich das nicht hinbekommen! Mit allen möglichen IF-Konstruktionen.
Kann mit bitte jemand helfen!
LG, Jens