Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

tabelas de tradução mysql com fallback de idioma ausente


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