我有以下模式: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值的目的是清楚地向我們展示哪些語言我們還沒有翻譯給定的短語。
我還沒有測試,但看着查詢,我認爲這將輸出NULL值的列「phrase_id」和「orig_phase」爲非匹配的語言代碼。因此,對於問題中的示例,它會輸出「1,cheese,FR,fromage」,「NULL,NULL,DE,NULL」,「NULL,NULL,ES,NULL」 – Abhay
您是對的。應該是一個左連接。固定。 –
恐怕LEFT JOIN可能不正確,因爲它不會顯示所有不匹配語言代碼的結果。所以DE和ES根本不會顯示。 – Abhay