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 中缺失的内容来复制用户和任务。
提前致谢
一种方法是创建一个表示 users
和 tasks
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 |
+------+-------+------+-------------+
我有一个 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 中缺失的内容来复制用户和任务。
提前致谢
一种方法是创建一个表示 users
和 tasks
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 |
+------+-------+------+-------------+