以一个具有用户的应用程序为例,每个用户可以只在一个组中。如果我们想要选择没有成员的组列表,那么正确的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 |
答案 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