2016-06-26 8 views
0

内の特定の試合は私がT3で見つかった結果はONLY =「保留」アクションで持つレコードを持っている場合は、レコードを取得する必要がある3つのテーブルを選択した結果三1

t1 
-------------- 
userID 
userEmail 
userName 
userType 

t2 
-------------- 
businessID 
businessUserID 

t3 
-------------- 
recordID 
recordBusinessID 
action (ENUM: pending, open, closed) 

を持っている場合。

SELECT 
    t2.businessID, 
    t1.userEmail, 
    t1.userName 
FROM t2 
LEFT JOIN t1 ON (t1.userID = t2.businessUserID) 
LEFT JOIN t3 ON (t3.recordBusinessID = t2.businessID) 
WHERE userType = 'active' 
AND t3.action = 'pending' 
t3.action != 'open' 
t3.action != 'closed' 

現在のt3が空であるため、結果が得られるはずですが、私はそうではありません。私は何が欠けていますか?

t3が結果を得ることができますが、t3.actionが 'pending'以外の場合は一致する必要があります。

+0

「AND t3.action is null」結果が得られると思います。しかし、あなたのwhere句はわかりませんが、smthgを選択します – splash58

+0

@ splash58 t3にマッチがある場合は結果を選択する必要がありますが、それは '保留中'でなければなりません。 – santa

+0

これが正しいと確信していますか?LEFT JOIN t3 ON(t3.recordBusinessID = t2.businessUserID) '。あなたのフィールド名から、私は結合が 't3.recordBusinessID = t2.businessID'であると期待します。 –

答えて

0

Nullを任意の値と比較すると、not equal toにチェックを入れてもNullが返されます。だから、そこには、対応する値ではないか、それが何かに等しくないことをテストするために、そうする:

where ... and (t3.action is null or t3.action != 'pending') 
0

なぜあなたはLEFT JOINを使用していますか? t3.action = 'pending'に一致するレコードのみが必要な場合は、通常の結合が機能します。

SELECT 
    t2.businessID, 
    t1.userEmail, 
    t1.userName 
FROM t1, t2, t3 
WHERE t1.userID = t2.businessUserID 
AND t2.businessID = t3.recordBusinessID 
AND t1.userType = 'active' 
AND t3.action = 'pending' 

これを機能させるには、3つのテーブルすべてにデータが必要です。 t3が空の場合、結果は表示されません。

は通常、WHERE句に一致するすべての行と、右側の表のON句に一致するすべての行を見つけるために使用されます。 mysql manualから:

LEFTで 部分は、NULLに設定され、すべての列と行が 右側のテーブルに使用されるJOIN右ONのテーブルまたは使用するための該当する行が存在しない場合。このファクトを使用して、 に別のテーブルの対応がないテーブル内の行を見つけることができます。

これがうまくいかない場合は、質問を明確にして、t1, t2, and t3テーブルのサンプルデータを投稿してください。

関連する問題