2013-05-27 42 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