2017-07-30 10 views
2

私はbelowsのように3つのテーブル持っているフィルタとは、リンク内のレコードとレコードを持っていない取得するためにテーブルを照会する方法:そのを翻訳特定の言語のために利用できるがある場合、私はテーブルをtranslation_tokenいるレコードは、同様

 
translation_token 
----------------- 
id token default_value 
-- ------ ------------- 
1 token_1 Token 1 
2 token_2 Token 2 
3 token_3 Token 3 

translation_token_value 
----------------------- 
id token_id language_id value 
-- -------- ----------- ----- 
1 1    1  Token 1 english 
2 1    2  Token 1 dutch 
3 2    1  Token 2 english 

application_module 
------------------ 
id name 
-- ---- 
1 project 
2 location 


LI_translation_token_application_module 
--------------------------------------- 
id token_id application_module_id 
-- -------- --------------------- 
1  1    1   
2  2    2   

をエントリはtranslation_token_valueテーブルに存在します。そうでない場合は、default_translationがトークンに対してフェッチされ、nullではありません。

また、これらのトークンは、特定のモジュール用であるか、すべてのモジュール用です。これらのトークンがモジュール用である場合、LI_translation_token_application_moduleテーブルにリンクが存在します。そうでない場合、エントリは存在しません。

レコードを取得する際には、常にモジュールと言語IDをフィルタに使用するため、特定のモジュールと言語の翻訳とその一般的な翻訳、つまりすべてのモジュールに適用できるトークンを取得します。

これまでのところ、私は以下の質問を試みましたが、成功しませんでした。私はtranslation_token_valueに翻訳がないトークンを取得していないので、そのようなトークンのdefault_translationが表示されます。左にある

SELECT translation_token.token, ttv.value, 
CASE WHEN ttv.value = NULL THEN translation_token.default_translation 
     ELSE ttv.value 
END 
FROM translation_token 
LEFT OUTER JOIN translation_token_value AS ttv ON ttv.token_id = translation_token.id 
LEFT OUTER JOIN LI_translation_token_application_module AS token_app_mod ON token_app_mod.token_id = ttv.token_id 
LEFT JOIN application_module 
ON application_module.id = token_app_mod.application_module_id 
WHERE (application_module.name IN('project') OR application_module.name IS NULL) 
AND (language_id = 2 OR language_id is null) 

答えて

2

あなたの問題は、「LI_translation_token_application_modは」「translation_token」デフォルトのトークン表を使用しないトークン値テーブル「translation_token_value」に参加します。

SELECT translation_token.token, ttv.value, 
CASE WHEN ttv.value Is NULL THEN translation_token.default_translation 
    ELSE ttv.value 
END 
FROM translation_token 
LEFT OUTER JOIN translation_token_value AS ttv ON ttv.token_id = translation_token.id and ttv.language_id=2 
LEFT OUTER JOIN LI_translation_token_application_module AS token_app_mod ON token_app_mod.token_id = translation_token.token_id 
LEFT JOIN application_module 
ON application_module.id = token_app_mod.application_module_id 
WHERE (application_module.name IN('project') OR application_module.name IS NULL) 
+0

以下のようにあなたもttv.valueがNULL' – Alex

+0

I'vされたときに ''にWHEN ttv.value = NULL'を変更する必要が私のミスを見つけるためのクエリのおかげ@Alex –

+0

@EidMorsyの感謝を編集しました。しかしこれは、LIテーブルに存在しないトークンをフェッチするための問題を解決するだけです。任意の言語のtranslation_token_valueテーブルにトークンのレコードが存在しない場合でも、このクエリは機能しません。 – Kammy

関連する問題