0

这个问题是一种扩展: 如何使用 MySQL 比较两个逗号分隔的字符串列表

我有一个TASKS_DONE有 2 列user_idtask_id(INT) 的表。这些代码用于表示用户执行的任务。

单独的表TASKSUSERS用于维护任务和用户的详细信息。

我的要求是检查用户是否完成了一组任务(例如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

请帮忙。

4

2 回答 2

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;
于 2013-01-17T10:09:06.763 回答
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)
于 2013-01-17T09:44:16.263 回答