2017-05-31 16 views
2

私は2つのテーブル:participantsresponsesを持つデータベースを持っています。参加者は、ゼロ、1つ、または多くの回答を持つことができます。応答も不完全である可能性があります(endedタイムスタンプ列にNULLがあるとマークされます)。参加者には、不完全な回答が1件または1件ある可能性があります。0または1つの関連レコードでレコードを検索する

回答がない、または回答が不完全な参加者をすべて見つけるにはどうすればよいですか?

これは、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

ん「参加者が多くの回答を持っている場合は、1つの応答が不完全であり、他人を使用する必要がありますね1つの回答が不完全である参加者」に属しているか? –

+0

@LeoZhao基本的に、努力していない(つまり、少なくとも1つの回答を完了した)すべての参加者を探しています。 – 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 
) 
関連する問題