2017-05-31 1 views
2

Ich habe eine Datenbank mit zwei Tabellen: participants und responses. Teilnehmer können null, eine oder viele Antworten haben. Antworten können auch unvollständig sein (markiert durch NULL in der ended Zeitstempelspalte). Teilnehmer konnten keine oder nur unvollständige Antworten haben.Suchen von Datensätzen mit null oder einem verwandten Datensätzen

Wie finde ich alle Teilnehmer, die entweder keine oder nur eine unvollständige Antwort haben?

Dies ist die SQL ich zum ersten Mal versucht:

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) 

ich den Fehler: Invalid use of group function

habe ich versucht, ein paar Variationen (z SELECT *, count(r.id) as numr usw.), aber bin immer no-wo. Ich glaube, ich brauche einen ganz anderen Ansatz.

+1

Ich denke, sollten Sie anstelle von verwenden, wo – minigeek

+0

Does „Die Teilnehmer viele Antworten haben, eine Antwort ist unvollständig und die anderen sind abgeschlossen "gehört zu" Teilnehmern, die eine Antwort haben, die unvollständig ist? –

+0

@LeoZhao im Grunde versuche ich alle Teilnehmer zu finden, die sich keine Mühe gegeben haben (d. H. Mindestens eine Antwort abgeschlossen haben). – Erics

Antwort

1

Ich würde bedingte Zählung verwenden, um die Anzahl der unvollständigen Antworten zu zählen und sie mit der Gesamtzahl der Antworten zu vergleichen. Die Filterung der Aggregatfunktionen muss in der Klausel having erfolgen.

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

Dies analysiert und führt ohne Fehler aus .. und auf den ersten Blick produziert Ergebnisse, die richtig aussehen. Ich werde tiefer durch die Daten graben, um sicher zu gehen. – Erics

0

Nicht sicher folgende Abfrage für Sie arbeiten, aber versuchen Sie es:

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 
) 
Verwandte Themen