さて、次のクエリはおそらくサブクエリなしで、代わりに結合を使用して実行できます。クエリオプティマイザがこれを行うと信じていますが、確信が持てません。
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=[the wanted country id]
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM languages l
このバージョンでは、language_id 1が優先フォールバックとして使用されており、おそらく同様の方法でさらに言語を追加できます。 FIND_IN_SET
の使用 代わりに、2次基準も機能します(FIND_IN_SET(cl.language_id,'1,2,3') DESC
または任意の順序)。
もちろん、このクエリは現在、固定されたcountry_idに対するものです。別の参加国がある複数の国でも同様の方法で拡張できます:
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=c.id
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM countries c
JOIN languages l
サブクエリの代わりに、country_languagesに2回参加し、nullではない最初の言語を選択することもできます(これはおそらくよりクリーンなソリューションの1つです):
SELECT l.name as language,
COALESCE(first.name, second.name) as country_name
FROM countries c
JOIN languages l
LEFT JOIN country_languages first ON
(first.country_id=c.id AND first.language_id=l.id)
LEFT JOIN country_languages second ON
(second.country_id=c.id AND second.language_id=1)
言語ID1がフォールバック言語である場合。これを拡張して、複数のフォールバック言語を提供することもできます...