2017-05-31 114 views
2

我有一个包含两个表的数据库:participantsresponses。参与者可以有零个,一个或多个响应。响应也可能不完整(标记为ended时间戳列中的NULL)。参与者可能有零个或一个不完整的答复。查找零个或一个相关记录的记录

我如何找到所有没有答复的参与者,或只有一个不完整的答复?

这是我第一次尝试的SQL:

SELECT * FROM participants p 
LEFT JOIN responses r 
    ON p.id = r.id_participant 
WHERE r.id IS NULL 
    OR (count(r.id) = 1 AND r.ended IS NULL) 

我得到的错误:Invalid use of group function

我尝试了一些变化(例如SELECT *, count(r.id) as numr等),但我没有得到,在哪里。我相信我需要一个完全不同的方法。

+1

我猜你应该使用具有的,而不是在那里 – minigeek

+0

是否“参与者有很多反应,一个反应是不完整的,其余完成“属于”参与者有一个不完整的答复“? –

+0

@LeoZhao基本上,我试图找到所有没有努力的参与者(即完成至少一个响应)。 – Erics

回答

1

我会使用条件计数来计算不完整响应的数量,并将其与总响应数进行比较。在聚合函数上进行过滤必须在having子句中完成。

SELECT p.* 
FROM participants p 
LEFT JOIN responses r 
    ON p.id = r.id_participant 
GROUP BY p.id --depending on mysql version you may have to list all fields from p here 
HAVING count(*)=0 
    OR count(*)=1 
AND count(IF(r.ended IS NULL, 1, NULL))=1 
+0

这解析和执行没有错误..乍一看产生的结果看起来是正确的。我会深入挖掘数据。 – Erics

0

不知道下面的查询不会为你工作,但尝试:

SELECT p.* 
FROM participants p 
LEFT JOIN responses r ON p.id = r.id_participant 
WHERE r.id IS NULL -- this will fetch participant with no response 
OR EXISTS (-- here will fetch participant with one incompleted response. 
    SELECT 1 
    FROM responses 
    WHERE p.id = responses.id_participant 
    GROUP BY responses.id_participant 
    HAVING SUM(responses.ended IS NULL) = COUNT(1) AND COUNT(1) = 1 
) 
相关问题