MySQL: JOIN wenn Abfrage nicht erfolgreich
winniepooh
- datenbank
0 gregor0 winniepooh
0 Vinzenz Mai
Guten Tag,
ich habe Schwierigkeiten, eine Idee per MySQL in die Tat umzusetzen und hoffe, hier Tipps zu erhalten.
Die Problemschilderung:
Es ist eine Tabelle vorhanden, welche folgende Felder enthält:
id INT auto_increment PRIMARY_KEY
key TEXT NOT NULL
en\_value TEXT NULL
de\_value TEXT NULL
fr\_value TEXT NULL
...
Es handelt sich dabei um eine Sprachtabelle, in welcher einem bestimmten Schlüssel der jeweilige Ausdruck in einer Sprache zugeordnet wird.
Beispiel:
Schlüssel (key): hello
englischer Wert (en\_value): hello
deutscher Wert (de\_value): Hallo
französischer Wert (fr\_value): Salut
Nun steht mir bei der Abfrage das Sprachkürzel zur Verfügung (d.h. englisch->en, deutsch->de, französisch->fr). Ich möchte anhand von diesem Kürzel den entsprechenden Wert auslesen.
Beispiel für deutsche Sprache:
SELECT de\_value FROM lang WHERE key = 'hello';
Klappt soweit natürlich.
Wenn jedoch kein Wert für den deutschen Ausdruck hinterlegt ist, so möchte ich den englischen auslesen.
SELECT de\_value, en\_value FROM lang WHERE key = 'hello';
Das liest mir jedoch immer sowohl den deutschen, als auch den englischen aus.
Ich möchte jedoch, dass versucht wird, den deutschen auszulesen, und erst wenn dies fehlschlägt, der englische ausgelesen wird.
Auf zwei Abfragen aufgeteilt würde das so aussehen:
SELECT de\_value AS value FROM lang WHERE key = 'hello' AND value IS NOT NULL;
(Überprüfung, ob Query erfolgreich. Wenn nein, zweites Query:)
SELECT en\_value AS value FROM lang WHERE key = 'hello' AND value IS NOT NULL;
Wie kann ich diese zwei Abfragen in einer zusammenfassen?
Der LEFT-, RIGHT- und INNER-JOIN scheinen mir dafür ungeeignet.
Habt Ihr einen Tipp, wie ich das realisieren kann?
Vielen Dank für Eure Mühe!
SELECT if(`de_value` IS NOT NULL,`de_value`,`en_value`) AS value FROM `lang` WHERE `key` = 'hello';
das wäre z.b. eine möglichkeit
Danke! Klappt soweit perfekt.
Nun einmal angenommen, dass kein englischer Wert hinterlegt ist (en\_value = NULL). Das Query würde trotzdem einen Datensatz zurückgeben, bei dem value = NULL ist. Wie kann ich erreichen, dass eine leere Rückgabe erfolgt, soweit de\_value und en\_value = NULL sind?
SELECT if(de\_value IS NOT NULL,de\_value,en\_value) AS value FROM lang WHERE key = 'hello' AND de\_value IS NOT NULL AND en\_value IS NOT NULL;
Diese Abfrage wäre möglich, gibt es noch eine kürzere Möglichkeit?
Falls mehr Felder verwendet werden wird es so nämlich ellenlang.
Gruß,
Philip
Ohje, zu spät die Stunde scheint mir.
Der Wert ist ja in value gespeichert ein einfaches
WHERE value IS NOT NULL
genügt also.
Danke.
Der Korrektheit wegen:
Einen Alias, wie es value in diesem Fall ist, kann man nicht mit WHERE verknüpfen.
Es muss die HAVING-Syntax verwendet werden:
SELECT ... HAVING value IS NOT NULL
Hallo,
Der Korrektheit wegen:
Einen Alias, wie esvaluein diesem Fall ist, kann man nicht mit WHERE verknüpfen.
Es muss die HAVING-Syntax verwendet werden:
SELECT ... HAVINGvalueIS NOT NULL
Der Korrektheit wegen. HAVING gehört zu GROUP BY.
Die weitaus bessere Lösung findest Du in meinem Posting.
Und ja, der Korrektheit wegen ORDER BY COALESCE(<argumentenliste>) ...
Freundliche Grüße
Vinzenz
Hallo,
Die Problemschilderung:
Es ist eine Tabelle vorhanden, welche folgende Felder enthält:
idINT auto_increment PRIMARY_KEY
keyTEXT NOT NULL
en\_valueTEXT NULL
de\_valueTEXT NULL
fr\_valueTEXT NULL
Wenn jedoch kein Wert für den deutschen Ausdruck hinterlegt ist, so möchte ich den englischen auslesen.
SELECT
de\_value,en\_valueFROMlangWHEREkey= 'hello';
Du suchst COALESCE():
SELECT -- Gib mir den ersten
COALESCE(de_value, en_value, fr_value, '') value -- von NULL verschiedenen
-- Eintrag der Parameterliste
FROM
lang
WHERE
`key` = 'hello' -- key ist ein Spaltenname, den ich auf
-- *jeden* Fall vemeide
Nein, diese komplexen IF-Konstrukte sollte man lieber lassen.
Freundliche Grüße
Vinzenz