jens65m: mysql abfrage / alternativen angeben

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

  1. 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

    1. 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.

      1. 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