2013-05-27 43 views
0

我有类似以下表格:加入,而不是子查询

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=?); 

但我有一种强烈的感觉,应该有一种更有效的方式来做到这一点,以某种方式加入其中小精灵。

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

回答

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 

UPDATE:如果你想加入从上面的查询结果,以获得额外的信息例如:某个用户的详细信息(从列表),可以使用:

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

任务确实是hlods任务ID的列。 – epeleg

+0

正如我怀疑:你是否尝试过查询? – Stephan

+0

是的,它的工作。但不知何故,我仍然错过了在一般情况下如何做我想做的事情:(例如 - 假设我现在想要将此查询的结果与其他表结合起来(例如,获取一些基于user_id的数据)多次出现 - 就像用户喜欢的食物一样 - 我希望能得到多行数据,每个喜欢的食物都有当前结果的重复数据)我会在这里接受你的答案,但是如果你能提供更多的见解,我会很棒。 – epeleg

0

我认为这将工作:

选择tasks.user_id,从任务,其中tasks.task = COUNT(*)?和task_closed = 0组由USER_ID

+0

IHMO这只看着每个用户的特定任务的任务状态,不是所有用户的任务。 即在我的示例中,如果询问有关任务3,是否将仅返回基于表3和4行的信息,并忽略属于这些行中的用户的其他行。 – epeleg

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 

这会复制你做什么。但我对你的查询感到困惑。您正在对所有任务的任务关闭进行计数,但您只希望由用户给出的任务结果。

+0

我打算查看与特定任务相关的用户,但想知道他们每个人有多少个打开的任务。 – epeleg

+0

关于此SQL代码的解释似乎效率较低。 – epeleg