sql >> Databasteknik >  >> RDS >> Mysql

mysql översättningstabeller med saknade språkalternativ

okej, så följande fråga kan förmodligen göras utan en underfråga men med en join istället. Jag skulle lita på att frågeoptimeraren gör detta, men jag skulle inte vara så säker.

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

I denna version används language_id 1 som den föredragna reserv, du kan förmodligen lägga till fler språk på liknande sätt. Använder FIND_IN_SET istället skulle som ett andra ordningens kriterium fungera lika bra (FIND_IN_SET(cl.language_id,'1,2,3') DESC eller vilken ordning du föredrar).

Naturligtvis är den här frågan just nu för ett fast country_id. Det skulle kunna utökas på liknande sätt för flera länder med en annan medlem:

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

ett alternativ till underfrågor skulle vara att gå med i country_languages ​​två gånger, och bara välja att den första inte är null (vilket förmodligen är en av de renare lösningarna):

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)

Om språk-id 1 är ditt reservspråk. Detta kan också utökas för att tillhandahålla flera reservspråk ...



  1. Flera bord sammanfogar i skenor

  2. Databasen uppdateras inte automatiskt med MySQL och Python

  3. Välj utan en FROM-sats i Oracle

  4. FEL:HHH000299:Kunde inte slutföra schemauppdatering java.lang.NullPointerException