选择表中未出现在另一个表的外键中的所有项

时间:2009-07-20 08:45:08

标签: sql mysql

以一个具有用户的应用程序为例,每个用户可以只在一个组中。如果我们想要选择没有成员的组列表,那么正确的SQL是什么?我一直觉得我只是想抓住查询,然后它又消失了。

奖励积分 - 考虑到替代的Senario,它是多对多的配对,识别未使用的组的SQL是什么?

(如果你想要具体的字段名称:) 一对多的:

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

许多一对多:

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

3 个答案:

答案 0 :(得分:4)

没有成员的群组(用于多人配对):

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

此Sql也适用于您的“第一个”示例,因为您可以在子查询中将“users”替换为“users_groups”=)

就性能而言,我知道这个查询在Sql Server上可以非常高效,但是我不太确定MySql是否喜欢它...

答案 1 :(得分:2)

对于第一个,试试这个:

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

对于第二个,试试这个:

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

答案 2 :(得分:1)

SELECT * 
FROM groups
WHERE groups.id NOT IN (
    SELECT user.group_id 
    FROM user
) 

它将返回用户

中不存在的所有组ID