2017-04-19 60 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

你是对的,改变了答案 –

相关问题