2017-07-30 96 views
2

我有3代表为初级讲座:如何查询表,以获取其链路记录中没有任何记录,并有过滤记录,以及

 
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表,如果有翻译适用于特定的语言,然后它条目将存在于translation_token_value表中,否则default_translation将被取回为令牌并且不为null。

此外,这些令牌既可用于特定模块,也可用于所有模块。如果这些令牌用于模块,那么LI_translation_token_application_module表中将存在链接,否则不会有任何条目。

获取记录时,我总是有模块和language_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

你也需要改变'WHEN ttv.value = NULL'到'WHEN ttv.value IS NULL' – Alex

+0

心中已经编辑查找我的错误查询感谢@Alex –

+0

@EidMorsy感谢。但是这只是解决了在LI表中不存在令牌的问题。如果任何语言的translation_token_value表中没有令牌记录,则此查询仍然不起作用。 – Kammy

相关问题