考虑三个表 –
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,因为他已经完成了两种类型的训练.