2011-06-23 17 views
1

nullを返す:MySQLは参加 - 3つのテーブルを、私は次のスキーマを持って空の

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  | 
                     ------------------------------ 

どのようなデータのこのコレクションはありませんが、与えられた米国英語のフレーズのため、それはあなたに対応する翻訳を与えるさをフランス語、ドイツ語、スペイン語の3言語で提供されています(少なくともウェブアプリケーションのコンテキスト内では、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   | <NULL>  | 
| 1  | cheese  | ES   | <NULL>  | 
------------------------------------------------------- 

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

しかし、それは返すようにするために、私はを意図しですNULL値を取得するためにそこにLEFTまたはRIGHT JOINを戻しますが、それを書いている方法を正確に出してください。

これはすべて言われていることですが、明らかにドイツ語とスペイン語の翻訳もあります。私はそれに合わせる必要がありますが、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

私はテストしていませんが、クエリを見て、これは、一致しない言語コードの "phrase_id"と "orig_phase"列にNULL値を出力すると思います。したがって、質問の例では "1、cheese、FR、fromage"、 "NULL、NULL、DE、NULL"、 "NULL、NULL、NULL、ES、NULL"を出力します。 – Abhay

+0

あなたは正しいです。左の結合であったはずです。一定。 –

+0

LEFT JOINも正しくない可能性があります。これは、一致しない言語コードでは結果が表示されないためです。 DEとESは全く表示されません。 – Abhay

1

LEFTまたはRIGHT結合が必要です。これはうまくいくはずです:

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`; 

希望します。

関連する問題