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の使用 代わりに、2次基準も機能します(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に2回参加し、nullではない最初の言語を選択することもできます(これはおそらくよりクリーンなソリューションの1つです):

    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)
    

    言語ID1がフォールバック言語である場合。これを拡張して、複数のフォールバック言語を提供することもできます...



    1. SQL、Postgres OID、それらは何であり、なぜそれらは有用ですか?

    2. Oracleの集計を使用したテーブルの回転/ピボット

    3. phpMyAdminでルートログインを無効にする

    4. selectステートメントの列の順序はクエリ速度に影響しますか?