ok, quindi la seguente query può probabilmente essere eseguita senza una sottoquery ma con un join invece. Mi fiderei che Query Optimizer lo faccia, ma non ne sarei troppo sicuro.
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 questa versione language_id 1 viene utilizzato come fallback preferito, probabilmente potresti aggiungere più lingue in modo simile. Utilizzando FIND_IN_SET
invece funzionerebbe anche come criterio di secondo ordine (FIND_IN_SET(cl.language_id,'1,2,3') DESC
o qualunque ordine tu preferisca).
Ovviamente questa query in questo momento è per un country_id fisso. Potrebbe essere esteso in modo simile per più paesi con un'altra adesione:
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
un'alternativa alle sottoquery sarebbe quella di unire due volte country_languages e selezionare semplicemente la prima che non sia nulla (che è probabilmente una delle soluzioni più pulite):
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)
Se language id 1 è la tua lingua di fallback. Questo può anche essere ampliato per fornire più lingue di riserva...