2017-04-19 58 views
0

我的表像,選擇此MySQL的 - 只有當所有的組都爲空

ID|EID|priority|completed_forms|all_forms_in 
1 |78 |NULL |y    |y 
2 |24 |NULL |y    |y 
3 |78 |1  |y    |y 

我想要完成的任務: 只選擇行,如果他們都有着相同的EID和所有共享NULL的優先級,併爲completed_forms和all_forms_in標記爲'y'。

我已經試過:這是我目前的select語句:

SELECT * FROM tasks 
WHERE priority IS NULL AND EID in 
(
SELECT * FROM 
    (select EID from tasks 
    WHERE completed_form = 'y' AND all_forms_in = 'y') as priority_check 
GROUP BY EID having count(*) = 2 
) 

預期結果: 我想這不返回行,因爲選擇應確保返回只有兩行是NULL。在這種情況下,ID 1和ID 3不能共享NULL。相反,它返回ID 1.

+1

爲什麼不應該與ID = 2行返回? EID必須有2行或更多'priority = NULL'? –

+0

在此示例中,它必須恰好爲2(GROUP BY EID的count(*)= 2)。由於EID = 24只有1個計數,因此不應退回。它應該看到的只有兩行是1和3.但它不應該選擇任何東西,除非它們都具有NULL優先級。 – osakagreg

+0

你能提供SqlFiddle嗎? –

回答

0

您可以添加AND COUNT(priority) = 0COUNT與字段名不計算空值),就像這樣:

SELECT EID FROM tasks 
GROUP BY EID HAVING 
    COUNT(priority) = 0 AND 
    COUNT(DISTINCT completed_form) = 1 AND MAX(completed_form) = 'y' AND 
    COUNT(DISTINCT all_forms_in) = 1 AND MAX(all_forms_in) = 'y'AND 
    COUNT(*) = 2 
+0

這會導致組功能無效使用 – osakagreg

+0

你是對的,改變了答案 –

相關問題