sql >> Base de Datos >  >> RDS >> Mysql

tablas de traducción mysql con respaldo de idioma faltante

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...