2016-06-30 5 views
0

Also Leute, versuchen, eine Abfrage zu schreiben, um die Anzahl der Status zu erhalten, wo project_id =? und Status in 'Neu' von ein paar Tischen, also lasst mich das kaputt machen.SQL-Abfrage mit 1 Join und 2 WHERE Klauseln, die nicht alle Datensätze zurückgeben

Ich habe diese drei Tabellen

Case_Status

id case_status 
1 New 
2 Failed 
3. Accepted 

Referral

id case_status_id project_id application_id 
1  1   1    20 
2  2   1    21 

Projekt

id name 
1 project1 
2 project2 

Also das ist meine Abfrage

SELECT COUNT(referrals.id) AS count_all, case_statuses.case_status AS counted 
    FROM "case_statuses" LEFT OUTER JOIN "referrals" ON "referrals"."case_status_id" = "case_statuses"."id" 
    WHERE "case_statuses"."deleted_at" IS NULL AND (case_statuses.case_status IN ('New') AND referrals.project_id = 1) 
    GROUP BY case_statuses.case_status; 

Das ist mein Ergebnis

count_all counted 
1   New 
1   Failed 

Aber ich dieses Ergebnis erwarten statt

count_all counted 
    1   New 
    1   Failed 
    0   Accepted 

Weiß jemand, was mit meiner Anfrage falsch ist, die für alles case_statuses Zählung zeigt wahr?

Dank

+0

Sie bekommen wirklich "NEU" in den Ergebnissen? case_statuses.case_status NOT IN ('New') in der WHERE-Anweisung sollte bedeuten, dass Sie sie nicht erhalten, weil Sie diesen Status ausdrücklich ausschließen. – Matt

Antwort

2

Bedingungen auf der zweiten Tabelle (in einem left join) sollte in der on Klausel:

SELECT COUNT(r.id) AS count_all, cs.case_status AS counted 
FROM case_statuses cs LEFT OUTER JOIN 
    referrals r 
    ON r.case_status_id = cs.id AND r.project_id = 1 
WHERE cs.deleted_at IS NULL AND cs.case_status NOT IN ('New') 
GROUP BY cs.case_status; 

Andernfalls wird die WHERE Klausel schaltet die äußere Verknüpfung in einen inneren verbinden.

0

Ihre Abfrage wie diese

ändern Sie Ihre Daten
SELECT COUNT(referrals.id) AS count_all, case_statuses.case_status AS counted 
    FROM "case_statuses" LEFT JOIN "referrals" ON "referrals"."case_status_id" = "case_statuses"."id" AND referrals.project_id = 1 
    WHERE "case_statuses"."deleted_at" IS NULL AND case_statuses.case_status NOT IN ('New') 
    GROUP BY case_statuses.case_status; 
0

gegeben und das erwartete Ergebnis, das Sie müssen nur die WHERE Klausel verlieren.

SELECT COUNT(referrals.id) AS count_all, case_statuses.case_status AS counted 
FROM case_statuses 
     LEFT OUTER JOIN referrals ON referrals.case_status_id = case_statuses.id 
GROUP BY case_statuses.case_status; 

Einzelheiten finden Sie unter fiddle.

+0

was ist mit referrals.project_id = 1 und "case_statuses". "Deleted_at" IS NULL? Ich würde denken, zumindest die project_id sollte Teil der ON-Bedingung sein und wer weiß über die deleted_at Spalte, weil es nicht in seinen Beispieldaten vorhanden ist. – Matt

+0

Wenn weitere Filterung auf der rechten Tabelle in einem 'LEFT JOIN' wird benötigt, dann muss es in der ON-Klausel sein. Siehe Gordons Antwort. –

+0

Ich bin mir dessen bewusst, ich habe nur versucht, mir selbst zu helfen, und Kingsley, der die Frage gestellt hat, versteht, dass einige seiner ursprünglichen Kriterien in Ihrer Antwort nicht dargestellt wurden, so dass Sie die gute Richtung erweitern könnten und beheben Sie das Problem, dass Kriterien aus der richtigen Tabelle in der Where-Klausel enthalten sind. Einen schönen Tag noch – Matt

Verwandte Themen