2013-01-17 26 views
0

这个问题比较独特的价值观是各种各样的扩展: How to compare two comma-separated string lists using MySQL在列表

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

单独的表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

请帮忙。

回答

1

试试这个:

​​

然后加入这个结果与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) 
2

我想有他们的地方,但corellated子查询才显得那么恶心。 ...

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; 
+0

“这种方法的问题是,如果用户执行过两次相同的任务,计数将包括任务的两个实例。“ – RandomSeed

+0

@Strawberry你能评论一下吗? – th3an0maly

+0

@YaK你是说不行,还是效率低下?它对我来说很好用 – th3an0maly