Mysql 查找具有零个或一个相关记录的记录

Mysql 查找具有零个或一个相关记录的记录,mysql,Mysql,我有一个包含两个表的数据库:参与者,和响应。参与者可以有零个、一个或多个回答。响应也可能不完整(在endtimestamp列中标记为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) =

我有一个包含两个表的数据库:
参与者
,和
响应
。参与者可以有零个、一个或多个回答。响应也可能不完整(在
end
timestamp列中标记为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)
我得到错误:
组函数的使用无效


我尝试了一些变化(例如,
SELECT*,count(r.id)为numr
等),但没有得到任何结果。我相信我需要一种完全不同的方法。

我会使用条件计数来计算不完整回答的数量,并将其与回答总数进行比较。必须在
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

不确定以下查询是否适合您,但请尝试:

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
)

我想你应该用have而不是where“参与者有很多反应,一个反应不完整,其他的都完成了”属于“有一个反应不完整的参与者”?@LeoZhao基本上,我在寻找所有没有努力的参与者(即至少完成了一个反应)@minigeek谢谢!我查了HAVING关键字是什么,发现这样一句话:“HAVING子句被添加到SQL中,因为WHERE关键字不能与聚合函数一起使用”。是的,基本上涵盖了它。它解析和执行时没有错误。。乍一看,结果是正确的。我会更深入地研究这些数据以确定。