okej, så följande fråga kan förmodligen göras utan en underfråga men med en join istället. Jag skulle lita på att frågeoptimeraren gör detta, men jag skulle inte vara så säker.
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
I denna version används language_id 1 som den föredragna reserv, du kan förmodligen lägga till fler språk på liknande sätt. Använder FIND_IN_SET
istället skulle som ett andra ordningens kriterium fungera lika bra (FIND_IN_SET(cl.language_id,'1,2,3') DESC
eller vilken ordning du föredrar).
Naturligtvis är den här frågan just nu för ett fast country_id. Det skulle kunna utökas på liknande sätt för flera länder med en annan medlem:
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
ett alternativ till underfrågor skulle vara att gå med i country_languages två gånger, och bara välja att den första inte är null (vilket förmodligen är en av de renare lösningarna):
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)
Om språk-id 1 är ditt reservspråk. Detta kan också utökas för att tillhandahålla flera reservspråk ...