2016-07-22 7 views
0

私は正しい方法で私の質問を投稿してください。Mysqlはフォールバック言語を使用して参加するか、フォールバック言語を条件にしました

表にフォールバック言語値

を返さない場合は、私の目標はlnaguageを渡すcountries_langに参加することですので、私は表すen_GBは、フォ​​ールバック言語である

+------+--------------+-----------------+ 
| id | region_code | sub_region_code | 
+------+--------------+-----------------+ 
| 1 | 142   | 034    | 
| 2 | 150   | 154    | 
| 3 | 002   | 015    | 
+------+--------------+-----------------+ 

+-----+--------------+---------------+--------------+ 
| id | pid | lang_code | lang_name | lang_capital | 
+-----+------------------+-----------+--------------+ 
| 1 | 1 | en_GB  |Canada  | Ottawa  | 
| 2 | 1 | de_DE  |Kanada  | Ottawa  | 
| 3 | 2 | en_GB  |Italy  | Rome   | 
+-----+------+-----------+-----------+--------------+ 

2テーブル「国」と「countries_lang」を持っています例:

選択した言語がde_DE

+------+--------------+-----------------+--------------+ 
| id | region_code | lang_name  | lang_capital | 
+------+--------------+-----------------+--------------+ 
| 1 | 142   | Kanada   | Ottawa  + 
| 3 | 150   | Italy   | Rome   + (fallback language) 
+------+--------------+-----------------+--------------+ 
です

は、私が試した:

Select * FROM countries AS c 
LEFT JOIN ( 
    SELECT pid, 
     COALESCE(
      (
       SELECT lang_name FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id 
      ), 
      (
       SELECT lang_name FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id 

      ) 
     ) AS cl_name, 
     COALESCE(
      (
       SELECT lang_capital FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id 
      ), 
      (
       SELECT lang_capital FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id 

      ) 
     ) AS cl_capital 
    FROM countries_lang 
) AS cl 

ON (c.id = cl.pid) 

が、リターンはUNKNOWN列

任意の提案をc.id?この問題を解決するためにテストをしている2日間です

ありがとうございます!私も、このようにしてみましたが、常にフォールバック言語値

Select * FROM countries AS c 
LEFT JOIN ( 
    SELECT pid, lang_name, lang_code FROM countries_lang WHERE lang_code = 'de_DE' AND lang_code IS NOT NULL OR lang_code = 'en_GB' 
) AS cl ON 
c.id = cl.pid 
+0

あなたの2つのテーブルを結合する方法は明らかではない、実際にエントリがすでに存在するとき、あなたの予想出力は英語を示し、なぜもそれは明らかではありません。 –

+0

フォールバックはどのように定義しますか? –

+0

参加が持つAS CL ON(c.id = cl.pid) –

答えて

1

を返す

EDIT

私はあなたのスキーマ・ロジックが何であるかの知識と正確に何を照会しようとしているが限られています。ここであなたの情報に基づいて私が思いつくことができます。それがどうなるか教えてください。

問合せ:

select cl.id, c.region_code, cl.lang_name, cl.lang_capital 
from countries_lang cl 
join countries c on c.id = cl.pid 
left join 
(select cl.id, cl.pid 
from countries_lang cl 
join countries c on c.id = cl.pid and cl.lang_code = 'de_DE') fcl on cl.pid = fcl.pid 
where cl.id = fcl.id or fcl.id is null 

結果:

+------+--------------+-----------------+--------------+ 
| id | region_code | lang_name  | lang_capital | 
+------+--------------+-----------------+--------------+ 
| 2 | 142   | Kanada   | Ottawa  + 
| 3 | 150   | Italy   | Rome   + 
+------+--------------+-----------------+--------------+ 
+0

こんにちは感謝あなたの返信。私は、スキーマが明確ではなく、私の目標は2番目のテーブルに参加していて、選択された言語(de_DE)の値がnullの場合、デフォルト言語en_GBを表示しているとは思わない。ちなみに、デフォルト言語en_GBを渡すコードでは? –

+0

こんにちはTin私はあなたのコードをよくチェックして、あなたのソリューションは性能に関して合致しています。 ;) –

0

OK]をクリックしてソリューションと希望を誰かのために参考になったこと!

SELECT * FROM countries AS c 
LEFT JOIN ( 
    SELECT jc.id, countries_lang.pid, countries_lang.lang_code, 

    COALESCE(
     (
      SELECT lang_name FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE' 

     ), 
     (
      SELECT lang_name FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB' 

     ) 
    ) AS coal_lang_name, 

    COALESCE(
     (
      SELECT lang_capital FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE' 

     ), 
     (
      SELECT lang_capital FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB' 

     ) 
    ) AS coal_lang_capital 

    FROM countries_lang 

    join countries jc on jc.id = countries_lang.pid 
) AS cl ON 
(c.id = cl.pid) 

のためだけfallback_languageのための2セッション変数1を設定する必要があるすべての言語に適用され、選択した言語の1

$ fallback_lang = $ _SESSION [ '表すen_GB'];またはその他のもの $ lang = $ _SESSION ['de_DE'];またはその他 - >を選択し

から取得し、変更上記のコードで

最初の合体 countries_lang.pid = jc.id AND countries_lang.lang_code = '$ LANG'

秒合体 where countries_lang.pid = jc.id AND countries_lang.lang_code = '$ fallback_lang'

COALESCEは、フォールバックよりも前にNULLでない最初の値を取得します。

乾杯!

関連する問題