mySQL SELECT mit LIKE und GROUP
Bambi
- datenbank
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
Hello,
SELECT * FROM
test
WHEREkey
LIKE 'form1_%' AND (lang
= 'en' ORlang
= 'de') GROUP BYkey
;
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
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