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 esvalue
in diesem Fall ist, kann man nicht mit WHERE verknüpfen.
Es muss die HAVING-Syntax verwendet werden:
SELECT ... HAVING
valueIS 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:
id
INT auto_increment PRIMARY_KEY
key
TEXT NOT NULL
en\_value
TEXT NULL
de\_value
TEXT NULL
fr\_value
TEXT NULL
Wenn jedoch kein Wert für den deutschen Ausdruck hinterlegt ist, so möchte ich den englischen auslesen.
SELECT
de\_value
,en\_value
FROMlang
WHEREkey
= '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