sql >> Databáze >  >> RDS >> Mysql

překladové tabulky mysql s chybějící jazykovou rezervou

dobře, takže následující dotaz lze pravděpodobně provést bez poddotazu, ale místo toho se spojením. Věřil bych, že to optimalizátor dotazů udělá, ale nebyl bych si tím příliš jistý.

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

V této verzi se jako preferovaná záloha používá language_id 1, pravděpodobně byste mohli podobným způsobem přidat více jazyků. Pomocí FIND_IN_SET místo toho by fungovalo i kritérium druhého řádu (FIND_IN_SET(cl.language_id,'1,2,3') DESC nebo jakoukoli objednávku, kterou byste preferovali).

Samozřejmě tento dotaz právě teď je pro pevné country_id. Mohlo by být rozšířeno podobným způsobem pro více zemí s dalším připojením:

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

alternativou k dílčím dotazům by bylo připojit se k country_languages ​​dvakrát a pouze vybrat ten první, který není null (což je pravděpodobně jedno z čistších řešení):

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)

Pokud je ID jazyka 1 vaším záložním jazykem. To lze také rozšířit tak, aby poskytovalo několik záložních jazyků ...



  1. MySQL:Výběr všech sloupců v tabulce plus jeden sloupec ze stejné tabulky

  2. Vrácení blob s json

  3. Codeigniter je „kde“ a „nebo_kde“.

  4. Oracle Managed ODP.NET nemůže najít tnsnames.ora