Mysql查找结果不存在于jointable中

时间:2015-12-14 22:56:48

标签: mysql sql join jointable

我有一个我无法弄清楚的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 

我无法弄清楚如何根据连接表中缺少的内容返回重复的用户和任务。

提前致谢

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是创建表示userstasks表的笛卡尔积的集合。如果每个用户都完成了每项任务,那么这就是结果。然后使用实际的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 |
+------+-------+------+-------------+