这个问题是各种扩展: How to compare two comma-separated string lists using MySQL
我有一个TASKS_DONE
表,其中包含2列user_id
和task_id
(INT)。这些代码用于表示用户执行的任务。
单独的表TASKS
和USERS
用于维护任务和用户的详细信息。
我的要求是检查用户是否完成了一组任务(比如2, 3, 5
)。目前,我有这个问题:
select * from USERS u
where
(
select SUM( IF(task_id in (2, 3, 5), 1, 0) )
from TASKS_DONE td
where td.user_id=u.user_id
group by td.user_id
) = 3
计数(在这种情况下为3
)将动态地提供给查询。这种方法的问题是,如果用户执行了两次相同的任务,则计数将包括任务的两个实例。但我只需要考虑task_id
请帮忙。
答案 0 :(得分:2)
我猜他们有一个地方,但是相关的子查询似乎太蠢了......
SELECT u.*
FROM users u
JOIN tasks_done td
ON td.user_id = u.user_id
AND td.task_id IN (2,3,5)
GROUP
BY u.user_id
HAVING COUNT(DISTINCT td.task_id) = 3;
答案 1 :(得分:1)
试试这个:
SELECT user_id
FROM users
JOIN (
SELECT task_id, user_id
FROM tasks
WHERE task_id IN (2, 3, 5)
GROUP BY task_id, user_id
) AS unique_tasks USING (user_id)
GROUP BY user_id
HAVING COUNT(user_id) = 3
然后再次将此结果集与users
连接以检索更多信息:
SELECT users.*
FROM users
JOIN (
SELECT user_id
FROM users
JOIN (
SELECT task_id, user_id
FROM tasks
WHERE task_id IN (2, 3, 5)
GROUP BY task_id, user_id
) AS unique_tasks USING (user_id)
GROUP BY user_id
HAVING COUNT(user_id) = 3
) AS selected_users USING (user_id)