sql >> Database >  >> RDS >> Mysql

mysql-vertaaltabellen met ontbrekende taalterugval

oke, dus de volgende query kan waarschijnlijk worden gedaan zonder een subquery maar met een join. Ik vertrouw erop dat de query-optimizer dit doet, maar ik zou er niet zo zeker van zijn.

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 deze versie wordt language_id 1 gebruikt als de geprefereerde fallback, je zou waarschijnlijk meer talen kunnen toevoegen op een gelijkaardige manier. FIND_IN_SET gebruiken in plaats daarvan zou een tweede-ordecriterium ook werken (FIND_IN_SET(cl.language_id,'1,2,3') DESC of welke volgorde u maar wilt).

Natuurlijk is deze vraag op dit moment voor een vaste country_id. Het kan op een vergelijkbare manier worden uitgebreid voor meerdere landen met een andere join:

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

een alternatief voor subquery's zou zijn om twee keer deel te nemen aan de country_languages, en gewoon de eerste te selecteren die niet null is (wat waarschijnlijk een van de schonere oplossingen is):

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)

Als taal-id 1 uw reservetaal is. Dit kan ook worden uitgebreid om meerdere fallback-talen te bieden ...



  1. Hoe kom ik erachter wanneer een bepaalde tabel in Oracle is gemaakt?

  2. ORA-30926:kan geen stabiele set rijen krijgen in de brontabellen bij het samenvoegen van tabellen

  3. PostgreSQL Meest recente invoer selecteren voor een gegeven ID

  4. MySQL:Wat is het verschil tussen float en double?