2011-06-23 43 views
1

我有以下模式:MySQL的加入 - 三個表,返回null哪裏空

phrase (in U.S. English): translation:         code_value: 
----------------------  ----------------------------------------- ------------------------------ 
| phrase_id | phrase |  | phrase_id | translation | language_cd | | code class | code value | 
----------------------  ----------------------------------------- ------------------------------ 
|  1  | cheese |  |  1  | fromage | FR  | | LANGUAGE_CD | FR  | 
----------------------  ----------------------------------------- | LANGUAGE_CD | DE  | 
                     | LANGUAGE_CD | ES  | 
                     ------------------------------ 

這個收集的數據確實是什麼,對於一個給定美國英語短語,它會給你相應的翻譯以法語,德語和西班牙語三種語言(至少在我們的網絡應用程序的背景下 - 我們不試圖成爲Google翻譯或任何其他語言)。

我想要做的是得到一個給定短語的所有翻譯的列表,如果沒有翻譯成給定的目標語言存在,我希望它返回NULL。

我的查詢到目前爲止是:

SELECT phrase.phrase_id, phrase.string orig_phrase, code_value.code_value, translation.string as trans_phrase 
FROM phrase, translation, code_value 
WHERE code_value.code_class = 'LANGUAGE_CD' AND translation.phrase_id = phrase.phrase_id 
ORDER BY orig_phrase; 

將返回:

------------------------------------------------------- 
| phrase_id | orig_phrase | code_value | trans_phrase | 
------------------------------------------------------- 
| 1  | cheese  | FR   | fromage  | 
| 1  | cheese  | DE   | fromage  | 
| 1  | cheese  | ES   | fromage  | 
------------------------------------------------------- 

但我打算它返回的是:

------------------------------------------------------- 
| phrase_id | orig_phrase | code_value | trans_phrase | 
------------------------------------------------------- 
| 1  | cheese  | FR   | fromage  | 
| 1  | cheese  | DE   | <NULL>  | 
| 1  | cheese  | ES   | <NULL>  | 
------------------------------------------------------- 

我知道我需要LEFT或RIGHT JOIN在那裏獲取NULL值,但我似乎無法確定完全如何寫它。

當這一切都說完之後,顯然我們也會在那裏有德語和西班牙語的翻譯,而且我需要它們進行匹配,但是NULL值的目的是清楚地向我們展示哪些語言我們還沒有翻譯給定的短語。

回答

1
SELECT phrase.phrase_id, phrase.string orig_phrase, code_value.code_value, translation.string as trans_phrase 
FROM phrase 
inner join translation on (translation.phrase_id = phrase.phrase_id) 
left join code_value on (code_value.code_value=translation.language_cd) 
WHERE code_value.code_class = 'LANGUAGE_CD' 
ORDER BY orig_phrase; 
+1

我還沒有測試,但看着查詢,我認爲這將輸出NULL值的列「phrase_id」和「orig_phase」爲非匹配的語言代碼。因此,對於問題中的示例,它會輸出「1,cheese,FR,fromage」,「NULL,NULL,DE,NULL」,「NULL,NULL,ES,NULL」 – Abhay

+0

您是對的。應該是一個左連接。固定。 –

+0

恐怕LEFT JOIN可能不正確,因爲它不會顯示所有不匹配語言代碼的結果。所以DE和ES根本不會顯示。 – Abhay

1

你是對的,你需要一個左或右連接。這應該工作:

SELECT `p`.`phrase_id`, `p`.`phrase` `orig_phrase`, `c`.`code_value`, `t`.`translation` `trans_phrase` 
FROM `phrase` `p` 
INNER JOIN (
    SELECT `code_value` 
    FROM `code_value` 
    WHERE `code_class` = 'LANGUAGE_CD' 
) `c` 
LEFT JOIN `translation` `t` ON `p`.`phrase_id` = `t`.`phrase_id` AND `c`.`code_value` = `t`.`language_cd`; 

希望這會有所幫助。