2009-07-20 12 views
5

たとえば、ユーザーが1つのグループにしか属せないアプリケーションがあります。メンバーを持たないグループのリストを選択したい場合、正しいSQLは何でしょうか?私はちょうど質問を把握しようとしているような気がして、もう一度消えます。テーブル内の、他のテーブルの外部キーに表示されないすべてのアイテムを選択します。

ボーナスポイント - 代替シナリオでは、多対多のペアリングで、未使用のグループを特定するSQLは何ですか?

多対多
Table 'users': | user_id | group_id | 
Table 'groups': | group_id | 

:あなたは具体的なフィールド名:) 1対多たい場合

(最初のもののために

Table 'users': | user_id | 
Table 'groups': | group_id | 
Table 'user-group': | user_id | group_id | 
+0

どちらの回答もありがとうございます。 2つの方法の間に機能的な違いがあるのであれば私は興味があります。 – dimo414

+0

@ dimo414 - 少なくともSql Server(2005)では、私のバージョンの実行計画は短く、わずかにコストがかかります。本当に、大量のデータセットを使用していない限り、どれが読みやすいと思うかは分かりません。 =) – Rob

+0

しかし、users_groupsの65,536行の同じバッチで両方のクエリを実行するだけで、クエリはバッチコストの1%で、バッチコストの99%になります。しかし、合計で2番目 – Rob

答えて

4

グループ:

SELECT * 
FROM groups g 
WHERE NOT EXISTS 
    (
     SELECT 1 
     FROM users_groups ug 
     WHERE g.groupid = ug.groupid 
    ); 

あなたが「users_groups」の「ユーザー」を置き換えることができますので、このSQLはまた、あなたの「最初」の例で動作しますサブクエリ=)

限りのパフォーマンスに関しては、

2

を、この試してみてください。

SELECT * FROM groups 
LEFT JOIN users ON (groups.group_id=users.group_id) 
WHERE users.user_id IS NULL; 

もう1つは、次を試してみてください。

(多くの-多くのペアリング用)にはメンバーを持っていません
SELECT * FROM groups 
LEFT JOIN user-group ON (groups.group_id=user-group.group_id) 
WHERE user-group.user_id IS NULL; 
1
SELECT * 
FROM groups 
WHERE groups.id NOT IN (
    SELECT user.group_id 
    FROM user 
) 

..私はこのクエリは、SQL Server上で、非常にパフォーマンスすることができることを知っているが、私は、MySQLはそれが好きどれだけのでわかりませんそれは後退するでしょうnユーザに存在しないすべてのグループID

関連する問題