加入而不是子查询

时间:2013-05-27 07:51:25

标签: mysql group-by

我有一张如下表:

 id   user_id    task    task_closed 
  1       1       1         0
  2       1       2         1
  3       1       3         0
  4       2       3         0 
  5       2       4         1
  6       3       4         0

我需要的是一个查询,对于给定的任务,将返回具有此任务的所有用途,并为每个任务返回他们拥有的总体未完成任务的数量。

这样,如果我们谈论任务3 我想得到

user_id  pending
   1        2
   2        1

,如

SELECT tasks.user_id,
       ( SELECT COUNT(*) 
         FROM tasks t2 
         WHERE t2.user_id=tasks.user_id AND t2.task_closed=0
       )
FROM tasks
WHERE tasks.id=?

我也会把它重写为

  SELECT user_id,COUNT(*) 
  FROM tasks  
  WHERE task=? AND task_closed=0 
  GROUP_BY user_id
  WHERE user_id IN (SELECT t2.user_id from tasks t2 WHERE task=?); 

但是我有一种强烈的感觉,应该有一种更有效的方法来通过某种方式加入桌子来做到这一点。

关于我应该怎么做的任何想法?

3 个答案:

答案 0 :(得分:1)

尝试此查询

SELECT 
   b.userid,
   count(*) as cnt
FROM 
   (SELECT DISTINCT userId FROM tasks WHERE task=?) a
INNER JOIN 
   tasks b
ON
   a.userId=b.userid
WHERE 
   b.task_closed = 0
GROUP BY 
   b.userid

这将复制你的所作所为。但我对你的查询感到困惑。你正在为所有任务计算任务关闭,但你想要的结果只是由用户给出的任务。

答案 1 :(得分:0)

试试这个:

SELECT 
    t1.user_id,
    COUNT(*)
FROM 
    tasks t1
INNER JOIN tasks t2
    ON t2.user_id=t1.user_id 
    AND t2.task_closed=0
WHERE 
    t1.id=?

但是假设任务的id是task列而不是id列(因为id是唯一的,这意味着对于1个任务,你不再有一个用户)

SELECT 
    t1.user_id,
    COUNT(*)
FROM 
    tasks t1
INNER JOIN tasks t2
    ON t2.user_id=t1.user_id 
    AND t2.task_closed=0
WHERE 
    t1.task=?
GROUP BY
    t1.user_id

更新:如果您想加入上面的查询结果以获取其他信息,请参阅:一些用户详细信息(field表中的user_details列)您可以使用方法:

SELECT
    tmp.user_id,
    tmp.nb,
    user_details.field
FROM (
    SELECT 
        t1.user_id,
        COUNT(*) as nb
    FROM 
        tasks t1
    INNER JOIN tasks t2
        ON t2.user_id=t1.user_id 
        AND t2.task_closed=0
    WHERE 
        t1.task=?
    GROUP BY
        t1.user_id
) as tmp
LEFT JOIN user_details
    ON user_details.user_id = tmp.user_id

答案 2 :(得分:0)

我认为这会奏效:

从tasks.task =?的任务中选择tasks.user_id,count(*)和task_closed = 0 group by user_id