Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 比较列表中的唯一值_Mysql - Fatal编程技术网

Mysql 比较列表中的唯一值

Mysql 比较列表中的唯一值,mysql,Mysql,这个问题是下列问题的延伸: 我有一个TASKS\u DONE表,它有两列user\u id和task\u id(INT)。这些代码用于表示用户执行的任务 使用单独的表任务和用户来维护任务和用户的详细信息 我的要求是检查用户是否完成了一组任务(比如2,3,5)。目前,我有以下问题: select * from USERS u where ( select SUM( IF(task_id in (2, 3, 5), 1, 0) ) from TASKS_DONE td

这个问题是下列问题的延伸:

我有一个
TASKS\u DONE
表,它有两列
user\u id
task\u id
(INT)。这些代码用于表示用户执行的任务

使用单独的表
任务
用户
来维护任务和用户的详细信息

我的要求是检查用户是否完成了一组任务(比如
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
在本例中)将动态地输入查询。这种方法的问题是,如果用户已执行同一任务两次,则计数将包括该任务的两个实例。但我只需要考虑一组不同的代码> TaskSuthID

请帮助。

试试这个:

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
然后再次将此结果集与
用户
连接,以检索更多信息:

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)
试试这个:

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
然后再次将此结果集与
用户
连接,以检索更多信息:

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)

我想它们是有一席之地的,但是协同子查询看起来太恶心了

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;

我想它们是有一席之地的,但是协同子查询看起来太恶心了

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;

“这种方法的问题是,如果用户执行同一任务两次,计数将包括任务的两个实例。”@草莓,你能对此发表评论吗?@YaK你是说它不起作用,还是说它效率低下?这对我来说很好me@YaK ? 但这正是OP想要的!?!我道歉。我没有注意到
DISTINCT
子句。我甚至不知道这是可能的@通常,这个查询比我的查询更可取。草莓,请编辑你的答案,这样我就可以投票了。“这种方法的问题是,如果用户执行了两次相同的任务,计数将包括任务的两个实例。”@草莓,你能对此发表评论吗?@YaK你是说它不起作用,还是说它效率低下?这对我来说很好me@YaK ? 但这正是OP想要的!?!我道歉。我没有注意到
DISTINCT
子句。我甚至不知道这是可能的@通常,这个查询比我的查询更可取。草莓,请编辑你的答案,这样我就可以投票了。