Mysql
 sql >> Database >  >> RDS >> Mysql

tabelle di traduzione MySQL con lingua mancante di fallback

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