2016-04-19 4 views
0

これはmysql v。4.xにあります...これは新人質問ですが何らかの理由で私は確信していますこれを動作させるためにSQLを理解することはできません。ここでは、関連するテーブルの近似値は次のとおりです。mysql外部結合 - 相関テーブルに常にエントリがないレコードの完全なリストを返す

Item 
--- 
ItemID 

など

ItemPerson 
-------- 
PersonID 

ItemID 

TimeAccessed 

のはのは、私が持っているとしましょう、私は1,2,3,4,5

の項目IDを持っているとしましょうItemPersonの1レコード:{'JohnDoe',1,'12:00PM'}

私は入力としてPersonNameを持っています。アイテムがアクセスされた時間を含め、すべてのアイテムのリストが返されるようにしたい。そのアイテムが指定されたPersonNameによってアクセスされなかった場合、その時間はNULLが必要です。私は次のことを試してみた

SELECT i.*, ip.TimeAccessed 
FROM Item i LEFT OUTER JOIN ItemPerson ip 
ON i.ItemID = ip.ItemID 
WHERE (ip.PersonName = 'JohnDoe' OR ip.PersonName IS NULL) 

私は「JohnDoeさん」の期待どおりの結果を得る...すべての項目が返され、ItemIDを1時間を持っています。

「JohnDoe」を「JaneDoe」に変更した場合、ItemIDの2-5しか取得できませんが、すべてのアイテムを返すクエリをすべての時間だけNULLにします。

+0

左はJaneDoeの結果を制限するものです。それらがすべて必要な場合は、「外部結合」(左揃えなし)を試してください。関連するレコードだけが必要な場合は、左または右の内部結合を使用します。 –

答えて

0

このような状況では、LEFT JOINは扱いにくいことがあります。人の条件をON句に移動する必要があります。それ以外の場合は、その人物に関連付けられたアイテムを取得しているか、または誰もいない状態になっています。 (論理的に言えば、オプティマイザは別として、JOINの後にWHEREが発生します)。

+0

ugh。はい、もちろん!私は脳の経過を知っていた。それは完璧に働いた。私はシステムが私にできるようになるとすぐにこれをマークします。 – magnvs78

関連する問題