oke, dus de volgende query kan waarschijnlijk worden gedaan zonder een subquery maar met een join. Ik vertrouw erop dat de query-optimizer dit doet, maar ik zou er niet zo zeker van zijn.
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
In deze versie wordt language_id 1 gebruikt als de geprefereerde fallback, je zou waarschijnlijk meer talen kunnen toevoegen op een gelijkaardige manier. FIND_IN_SET
gebruiken in plaats daarvan zou een tweede-ordecriterium ook werken (FIND_IN_SET(cl.language_id,'1,2,3') DESC
of welke volgorde u maar wilt).
Natuurlijk is deze vraag op dit moment voor een vaste country_id. Het kan op een vergelijkbare manier worden uitgebreid voor meerdere landen met een andere join:
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
een alternatief voor subquery's zou zijn om twee keer deel te nemen aan de country_languages, en gewoon de eerste te selecteren die niet null is (wat waarschijnlijk een van de schonere oplossingen is):
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)
Als taal-id 1 uw reservetaal is. Dit kan ook worden uitgebreid om meerdere fallback-talen te bieden ...