Mysql Case mit mehreren linken äußeren Joins - mysql, sql

Ich experimentiere mit der folgenden Idee. Ich versuche, ein Fallback-System alle in der einzelnen Abfrage zu erstellen. Hier einige Hintergrundinformationen:

posts_table
id, timestamp

posts_content_table
id, post_id, language_id, title, description

Das Ziel ist es, posts_table dann in dergleiche Abfrage, verbinden Sie die posts_content_table mit einem Fallback-System. Wenn ich nach Post-Inhalt mit einer Sprache-ID suche, die nicht existiert, sollte es in der Lage sein, auf eine Sprache-ID zurückzufallen, die Inhalt enthält. Es sollte mehrere Ebenen von Fallbacks erlauben.

Beispiel:

SELECT p.id FROM posts_table AS p

LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc2 ON (p.id=pc2.post_id AND pc2.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc3 ON (p.id=pc3.post_id AND pc3.language_id=3)

Natürlich wird es passieren, wenn es zurückkehrtDaten, die nicht null sind, sollten diese Daten als Endergebnis verwendet werden. Das bringt mich zu CASES. Wie würde ich CASES implementieren, um auf diese Weise zu arbeiten? Würde das Folgende ausreichen?

SELECT p.id, CASE title
WHEN pc.title is Null THEN pc2.title
WHEN pc2.title is Null THEN ps3.title
WHEN pc3.title is Null THEN "-"
END
FROM posts_table AS p

LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=3)

Antworten:

3 für die Antwort № 1

Dies ist der Zweck von COALESCE(), die den ersten Nicht-Null-Wert ihrer Argumente zurückgibt:

SELECT
p.id,
COALESCE(pc.title, pc2.title, pc3.title, "-") AS title
FROM posts_table AS p
LEFT OUTER JOIN posts_content_table AS pc ON (p.id=pc.post_id AND pc.language_id=1)
LEFT OUTER JOIN posts_content_table AS pc2 ON (p.id=pc2.post_id AND pc2.language_id=2)
LEFT OUTER JOIN posts_content_table AS pc3 ON (p.id=pc3.post_id AND pc3.language_id=3)

(Hinweis: Ich habe Ihre Tabellen-Aliase korrigiert - sie waren alle pc und ich nehme an, du wolltest das als Alias ​​bezeichnen pc, pc2, pc3)


Speisekarte