我有一个我无法弄清楚的mysql问题。它与我在SO上发现的其他问题略有不同。
我有三张桌子
users
____________
ID name
1 John
2 Mike
3 Susie
tasks
___________
ID Name
1 Brush Teeth
2 Shower
3 Check Email
users_tasks
_____________________
ID user_id task_id
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 3 1
我试图找出用户尚未完成哪些任务。我希望结果集看起来像这样:
user_id task_id
__________________
2 3
3 2
3 3
我最接近的是这个查询,它只给我那些尚未完成至少一项任务但却没有给我任务的用户。
select * FROM users
right JOIN users_tasks on users.id = users_tasks.user_id
right JOIN tasks on users_tasks.task_id = tasks.id
where tasks.id is null
我无法弄清楚如何根据连接表中缺少的内容返回重复的用户和任务。
提前致谢
答案 0 :(得分:1)
执行此操作的一种方法是创建表示users
和tasks
表的笛卡尔积的集合。如果每个用户都完成了每项任务,那么这就是结果。然后使用实际的users_tasks
表进行左连接并过滤null以获取缺少的项:
select sub.*
from (
select u.id user_id, t.id task_id
from users u, tasks t
) sub
left join users_tasks ut on sub.user_id = ut.user_id and sub.task_id = ut.task_id
where ut.ID is null;
答案 1 :(得分:1)
一个简单的解决方案就是要求条目不在您已完成的任务表中:
select * from users, tasks
where not exists (
select * from users_tasks
where users.id = users_tasks.user_id and tasks.id = users_tasks.task_id
);
结果:
+------+-------+------+-------------+
| id | name | id | name |
+------+-------+------+-------------+
| 3 | susie | 2 | Shower |
| 2 | mike | 3 | Check Email |
| 3 | susie | 3 | Check Email |
+------+-------+------+-------------+