2017-05-06 28 views
0

我有其中一個用戶被分配的任務表。他們可能在表格中有1行或多達5行 - 沒有最大值或最小值 - 它是隨機的。如果用戶完成了他們的所有任務,他們的電子郵件需要從電子郵件列表中刪除。問題是,用戶可能有一個任務或者2,3,等我不能寫一個簡單的查詢,查找自己在工作領域ID,因爲它會找到他們,即使他們只完成1個任務。所以,我需要編寫一個查詢,只有當所有任務完成時才能找到他們的電子郵件。我怎麼寫,當有多個條件來考慮的查詢?

實施例的表:

用戶ID -----任務
1 ---------- 0

2 ---------- 0

3 ---------- 1

3 ---------- 0

3 ---------- 0

4 ---------- 1

所以,你可以看到,用戶1只有一個任務,但用戶3有3個任務。

如果我使用此查詢,用戶3將被從列表中刪除,即使他還有任務要完成:

SELECT userID from table_name 
where task = 1 

我實際的查詢比這更復雜,但我怎麼會寫一個查詢,找到完成所有任務的任何用戶ID?

我試過,但沒有奏效:

SELECT userID from table_name 
where task = 1 
and task != 0 
+0

你可以說明你的表結構是什麼, – Martin

+0

這任務完成了'0'還是'1'? – bansi

+0

任務完成= 1 – user2554201

回答

0

嘗試此查詢:

SELECT userID 
FROM table_name 
GROUP BY userID 
HAVING SUM(CASE WHEN task = 0 THEN 1 ELSE 0 END) = 0 

HAVING子句將彙總每個用戶的記錄和計算的其中一個未完成的任務次數(由task=0指示)發生。你可以用task <> 1更換邏輯,如果可能有其他的任務,除了代碼0和1

+0

試過這個但不工作,感謝這個想法: – user2554201

+0

從jos_users選擇DISTINCT(u.email)作爲電子郵件 u,keyperson k 其中(k.kp1 = u.id和k.check1 = 1 ) HAVING SUM(CASE WHEN(k.kp1 = u.id and k.check1 = 1)THEN 1 ELSE 0 END)= 0 – user2554201

+0

使選擇DISTINCT(u.email)爲電子郵件 from jos_users u,keyperson k 其中(k.kp1 = u.id和k.check1 = 1) HAVING SUM(CASE WHEN(k.kp1 = u.id和k.check1 = 0)THEN ELSE 1 END 0)= 0 – user2554201

0

要檢查,如果沒有一個不完整的任務

SELECT tn.userID from table_name tn 
where tn.task = 1 
    and not exists (select 1 from table_name tn2 
        where tn1.userID = tn2.userID 
         and tn.task = 0) 
+0

你失去了我在2個不同的表名TN1和TN2 – user2554201

+0

所有TN1和TN2的是表的別名,在這種情況下,他們碰巧是同一個表。 –