考虑三个表——
每个用户都有一个类型,而类型定义了每个特定类型的用户需要完成的培训。
我想找出所有已成功完成其必须参加的所有培训的用户。
以下是我的思路:
显然,这不是正确的查询,因为即使用户已经完成了其中一项培训,我们仍然会得到该行。在上述示例中,我想获得id=2,因为他已经完成了其类型的两个培训。
users
id | type
-----------|------------
1 | a
2 | b
3 | c
types
id | type
-----------|------------
a | X
a | Y
b | X
c | X
c | Y
c | Z
training_status
id | training| status
-----------|-----------|-------------
1 | X | F
2 | X | S
2 | Y | S
3 | X | F
3 | Y | S
每个用户都有一个类型,而类型定义了每个特定类型的用户需要完成的培训。
training_status
包含用户参加的所有培训的状态和结果(S,F)。如果用户还没有参加培训,则不会有该培训的行。我想找出所有已成功完成其必须参加的所有培训的用户。
以下是我的思路:
select
id
from users
join types
using (type)
left join training_status
using (id,type)
where status NOT IN(None, F);
显然,这不是正确的查询,因为即使用户已经完成了其中一项培训,我们仍然会得到该行。在上述示例中,我想获得id=2,因为他已经完成了其类型的两个培训。
SELECT id, SUM(status IS NULL or Status is not 'S') as pending from users join types using (type) join training_status using (id, training) group by id having pending = 0;
- zonked.zonda