bien, entonces la siguiente consulta probablemente se pueda hacer sin una subconsulta pero con una combinación en su lugar. Confío en que el optimizador de consultas haga esto, pero no estaría muy seguro.
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
En esta versión, language_id 1 se usa como el respaldo preferido, probablemente podría agregar más idiomas de manera similar. Usando FIND_IN_SET
en cambio, también funcionaría como criterio de segundo orden (FIND_IN_SET(cl.language_id,'1,2,3') DESC
o el orden que prefieras).
Por supuesto, esta consulta en este momento es para un country_id fijo. Podría extenderse de manera similar para varios países con otra combinación:
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
una alternativa a las subconsultas sería unir country_languages dos veces, y simplemente seleccionar el primero que no sea nulo (lo que probablemente sea una de las soluciones más limpias):
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)
Si el ID de idioma 1 es su idioma alternativo. Esto también se puede ampliar para proporcionar varios idiomas alternativos...