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