我今天在这里提出一个让我感到困惑和困惑的问题。也许有人在那里可以给我一些帮助。
我有三张桌子如下。请注意,这个问题已经简化了。
// // table_checks
check_id |task_id| status
1 | 1 | Done
2 | 1 | Done
3 | 1 | Done
4 | 2 | Done
5 | 2 | Not Done
6 | 2 | Not Done
7 | 2 | Not Done
8 | 2 | Done
9 | 3 | Done
10 | 3 | Done
11 | 3 | Not Done
12 | 3 | Done
// // table_user
user_id | email | type
1 | a@a.com | IN
2 | b@b.com | IN
3 | c@c.com | EX
// // table_chk_usr
check_id |user_id
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
6 | 2
7 | 2
8 | 2
9 | 3
10 | 3
11 | 3
12 | 3
以下是table_chk_usr表中的三个表及其关系。
我的问题是如何从表table_user
中查询并选择'IN'
行table_user
行,其中所有用户都在task_ids
中分配了table_checks
使用status
= done
。
因此预期结果应如下
// // table_user
user_id | email | type
1 | a@a.com | IN
因为带有1的user_id已完成状态已完成的所有task_id。
我希望这对那些正在阅读的人有意义。任何帮助将不胜感激。
请注意,我使用PHP作为我的服务器端语言,如果这有任何帮助。
答案 0 :(得分:2)
我认为这就是你要找的东西。
select user.user_id, user.email, user.type,
sum(if(status = 'done',1, 0)) as done, count(*) as checks
from checks
join chk_user on checks.check_id = chk_user.check_id
join user on chk_user.user_id = user.user_id
group by chk_user.user_id
having done = checks
答案 1 :(得分:0)
您可以在此处使用联接,但可能有更好的方法来执行此操作。
SELECT * FROM table_checks
INNER JOIN table_chk_usr
ON table_checks.check_id = table_chk_usr.check_id
INNER JOIN table_user
ON table_chk_usr.user_id = table_user.user_id
WHERE table_checks.status = 'Done'
AND table_user.type = 'IN'