2016-05-22 8 views
0

私は多言語対応のCMSを持っています。ユーザーが選択した言語を変更すると、システム全体で使用される約300の単語とフレーズが変更されます。英語がデフォルト言語です。いかなる言語でも、他の言語は完全に翻訳されていない可能性があります。私は、特定の単語やフレーズが選択された言語に翻訳されていないケースバイケースで、英語版をフォールバックしたいと思っています。 (スタックオーバーフローがテーブルのhtmlタグは使用できませんので、私は順不同リストを使用して2つのレコードが表示されます)SQLのフロー制御/条件(CASE)

language_id label   translation 
en   your_account Your Account 
zh   your_account 您的賬戶 

主キーは、私はMariaDBにPDOを使用していますLANGUAGE_IDとラベル

です。私は上で立ち往生しています私のクエリの一部は、私が知っていれば/ケースステートメントは、以下の完全に間違っているが、それは私が達成したいものを示しています

SELECT translation_result 
FROM (SELECT translation as translation_result FROM languages WHERE 
label='your_account' AND language_id = 'zh')A 
CASE A.translation_result IS NOT NULL ELSE 
(SELECT translation as translation_result FROM languages WHERE 
label='your_account' AND language_id = 'en')B 
+1

これを行うにはいくつかの方法があります。翻訳テーブルから単語を取得する典型的なクエリを例として表示できますか? –

+0

HTMLテーブルを試す代わりに、テキストテーブルに貼り付け、ハイライト、ctl-kまたは '{}'をコードブロックとしてフォーマットしてください。デモをセットアップするには、回答者のためにコピー/ペーストするのが最も簡単です。 –

答えて

0

は、ここで私はどうなるのかです:

SELECT (IFNULL(ZH.translation, EN.translation)) AS translation_result 
FROM languages EN 
LEFT JOIN languages ZH ON EN.label=ZH.label AND ZH.language_id = 'zh' 
WHERE EN.label='your_account' 
    AND EN.language_id = 'en' 

英語はマスター言語であり、常に入力されるため、英語のレコードに対して基本クエリを作成します。これは常に何かを返します。英語が返すものから、LEFT JOINを同じ表で、異なるラベルを使って同じラベルにします。 JOINが一致するもの(NULLはありません)を使用している場合は、この値を使用してください。

しかし、言語テーブルの最終クエリがどのようなものになるかを表すものではありませんアプリケーションで通常、他のテーブルに「マスター」クエリを作成し、ユーザの言語に続いてlanguageテーブルにLEFT JOINクエリを追加してください。 実際の例を追加することができます。

+0

'CASE'全体を' IFNULL(ZH.translation、EN.translation) 'に置き換えることができます。 – shmosel

+0

@shmosel良いキャッチ。私は時々あまりにも多くのANSI標準です:) –

+0

IFNULLはANSI SQLのCOALESCEと同じですか? – jarlh