ok, então a consulta a seguir provavelmente pode ser feita sem uma subconsulta, mas com uma junção. Eu confiaria que o otimizador de consulta faz isso, mas não teria muita certeza.
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
Nesta versão language_id 1 é usado como o substituto preferido, você provavelmente poderia adicionar mais idiomas de maneira semelhante. Usando
FIND_IN_SET
em vez disso, um critério de segunda ordem também funcionaria (FIND_IN_SET(cl.language_id,'1,2,3') DESC
ou qualquer ordem que você preferir). Claro que esta consulta agora é para um country_id fixo. Pode ser estendido de maneira semelhante para vários países com outra junção:
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
uma alternativa para subconsultas seria juntar o country_languages duas vezes, e apenas selecionar o primeiro não sendo nulo (o que provavelmente é uma das soluções mais limpas):
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 o ID do idioma 1 for seu idioma substituto. Isso também pode ser expandido para fornecer vários idiomas de fallback ...