Mysql
 sql >> база данни >  >> RDS >> Mysql

таблици за превод на mysql с липсващ езиков резервен вариант

добре, така че следната заявка вероятно може да бъде извършена без подзаявка, но вместо това с присъединяване. Бих вярвал, че оптимизаторът на заявки прави това, но не бих бил много сигурен.

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

В тази версия language_id 1 се използва като предпочитан резервен вариант, вероятно бихте могли да добавите още езици по подобен начин. Използване на FIND_IN_SET вместо това като критерий за втори ред също ще работи (FIND_IN_SET(cl.language_id,'1,2,3') DESC или какъвто ред предпочитате).

Разбира се, тази заявка в момента е за фиксиран country_id. Може да бъде разширено по подобен начин за множество държави с друго присъединяване:

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

алтернатива на подзаявките би била да се присъедините към country_languages ​​два пъти и просто да изберете първата, която не е нула (което вероятно е едно от по-чистите решения):

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)

Ако езиков идентификатор 1 е вашият резервен език. Това може също да бъде разширено, за да предостави множество резервни езици ...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL избира редове, където лявото присъединяване е нула

  2. MySQL:композитен индекс пълен текст+btree?

  3. MySqlDb хвърля Операнд трябва да съдържа 1 колона(и) при вмъкване на оператор за игнориране

  4. mysql SQL:конкретен елемент да бъде първи и след това да сортирате останалите елементи

  5. PHP/MySQL:Най-добри практики за парични операции/съхранение?