2017-05-31 166 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 
) 
相關問題