2011-12-14 5 views
0

私は2つのテーブルがあります。選択データ

|id| username  | 
------------------- 
|1 |John Doe  | 
|2 |Jane Doe  | 
|3 |Luke Skywalker| 

|id|user_id|group_id| 
--------------------- 
|1 |1  |5  | 
|2 |1  |6  | 
|3 |2  |6  | 

を同じユーザーが同じグループに二度追加することはできませんので、私はグループで、既にユーザーをフィルタしようとしています。

テーブル2のgroup_id = 5にないすべてのユーザーをtable1から選択することはできますか。

SELECT * FROM table1 WHERE id NOT IN (SELECT user_id FROM table2 WHERE group_id=5) 

をしかし、一意性を確保するために、あなたがより良い表2に(user_id, group_id)にUNIQUE KEYを追加したい:

+0

ある表2中のものなしにあなたの両方のテーブルからの結果を与えるのだろうか? –

答えて

2
SELECT u.* 
FROM table1 u 
WHERE NOT EXISTS (
    SELECT 1 
    FROM table2 g 
    WHERE g.user_id = u.id AND g.group_id = 5 
) 
2

を使用でき

ALTER TABLE table2 ADD UNIQUE KEY unique_user_group (user_id, group_id); 

この方法は、MySQL自体優勝アプリケーション側で毎回チェックすることなく、重複したレコードを受け入れることはできません。

+0

INは通常、EXISTSよりも遅いです。 EXISTSは1つのレコードが見つかったら停止し、IN句のサブクエリは常にすべてのレコードを選択します –

+0

INはよりエレガントでパフォーマンスはおそらくあまり気にならないでしょう –

+0

良い点ですがサブクエリは実行されません一度、各レコードの代わりに、 'IN'を使うときは? – redShadow

1

where句で<>を指定してjoin句を使用する必要があります。それらがuser_idで結合されていると仮定すると、これはうまくいくはずです。

これは、あなたが以下の回答で、あなたの答えを見つけました= 5

SELECT * 
    FROM table1 t1 
    INNER JOIN table2 t2 ON t2.user_id = t1.id 
    WHERE t2.group_id <> 5