Mysql jointable 中不存在查找结果

Mysql finding results not present in jointable

我有一个 mysql 问题,我一直没弄清楚。它与我在 SO 上发现的其他问题有点不同。

我有三个 tables

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 

我不知道如何return 根据加入 table 中缺失的内容来复制用户和任务。

提前致谢

一种方法是创建一个表示 userstasks table 的笛卡尔积的集合。如果每个用户都完成了每项任务,这就是结果。然后与实际的 users_tasks table 进行左连接并过滤 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;

一个简单的解决方案就是要求该条目不在您已完成的任务中 table:

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 |
+------+-------+------+-------------+