Bambi: mySQL SELECT mit LIKE und GROUP

Hallo zusammen

Ich steh bei einer Datenbankabfrage an... Es geht darum, dass ich aus einer Tabelle alle Einträge einer Unterseite der Website in der gewählten Sprache auslesen möchte.

Angenommen, ich habe eine Tabelle mit der folgenden Struktur:
id   key               lang   text
1    form1_eintrag1    de     Dies ist mein erster Text
2    form1_eintrag1    en     This is my first text
3    form1_eintrag2    de     Zweiter Text
4    form1_eintrag2    en     Second text
5    form1_eintrag3    de     Dritter Text
6    form2_eintrag1    de     Formular zwei, Eintrag 1
7    form2_eintrag1    en     Second form, first entry

Die Standardsprache ist Deutsch (de);  für jeden key ist sicher immer ein deutscher Eintrag in der Datenbank. Wenn aber z.B. Englisch gewählt ist (en), kann es sein, dass ein Eintrag noch nicht übersetzt wurde (z.B. ID 5). In diesem Fall soll für diesen key der deutsche Eintrag selektiert werden.

Das Resultat sollte für den Bereich form1_ demnach so aussehen, wenn Deutsch gewählt wurde:
1    form1_eintrag1    de     Dies ist mein erster Text
3    form1_eintrag2    de     Zweiter Text
5    form1_eintrag3    de     Dritter Text

Und so, wenn Englisch gewählt wurde:
2    form1_eintrag1    en     This is my first text
4    form1_eintrag2    en     Second text
5    form1_eintrag3    de     Dritter Text

Ich hab's so probiert:
SELECT * FROM test WHERE key LIKE 'form1_%' AND (lang = 'en' OR lang = 'de') GROUP BY key;

Das ergibt folgendes Resultat:
1    form1_eintrag1    de     Dies ist mein erster Text
3    form1_eintrag2    de     Zweiter Text
5    form1_eintrag3    de     Dritter Text

Wie kann ich das Resultat so sortieren, dass zuerst meine Abfrage auch für den zweiten Fall klappt? Es wäre natürlich wenn das Ganze auch funktionieren würde, wenn die Zweitsprache z.B. be wäre (also im Alphabet vor de).

Ich bin froh um jeden Tipp!

Herzlichen Dank und liebe Grüsse
Bambi

Nun möchte ich abfragen, dass

  1. Hello,

    SELECT * FROM test WHERE key LIKE 'form1_%' AND (lang = 'en' OR lang = 'de') GROUP BY key;

    Mit if() oder mit der Sortierung arbeiten und immer den ersten einer Gruppe abholen.
    Die gewünschte Sortierung kannst Du dann z.B. mit der field()-Funktion herstellen.
    Hatten wir hier neulich erst.

    http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field

    Da diese Abfragen aber häufiger vorkommen werden, werden mehrere alternative Indexe besser sein.

    Harzliche Grüße aus
    Sankt Andreasberg
    und Frohes Neues Jahr

    Tom

    --
    Nur selber lernen macht schlau

    1. Hi Tom

      Vielen Dank für Deine Antwort!

      Mit if() oder mit der Sortierung arbeiten und immer den ersten einer Gruppe abholen.

      Hm, wie kann ich in meinem Fall if() verwenden? Ich hab diese Funktion unter http://dev.mysql.com/doc/refman/5.1/de/control-flow-functions.html gefunden, krieg das für meine Anwendung aber nicht hin...

      Das mit der Sortierung hatte ich bereits so versucht:
      SELECT distinct(text) FROM test WHERE key LIKE 'form1_%' AND (lang = 'en' OR lang = 'de') order by lang desc;

      Dann wird aber einfach der Text absteigend sortiert...

      Die gewünschte Sortierung kannst Du dann z.B. mit der field()-Funktion herstellen.

      Das ist mir ehrlich gesagt zu hoch. Ich hab keine Ahnung, wie ich das implementieren könnte.

      Da diese Abfragen aber häufiger vorkommen werden, werden mehrere alternative Indexe besser sein.

      Was meinst Du damit?

      Sorry, ich bin ein MySQL-Anfänger und war schon froh, dass ich diese Select-Abfrage überhaupt so hinbekommen habe. Deine Inputs tönen vielversprechend, aber ich kapier's (noch) nicht. Wäre es evtl. möglich, dass Du etwas mehr ins Detail gehst?

      Vielen herzlichen Dank und liebe Grüsse
      Bambi