PostgreSQL LEFT JOIN und fehlende Nullzählungen
PostgreSQLs LEFT JOIN
ist so konzipiert, dass alle Zeilen aus der linken Tabelle zurückgegeben werden, auch wenn es in der rechten Tabelle keine Übereinstimmung gibt. Allerdings können falsch platzierte WHERE
-Klauselbedingungen ein LEFT JOIN
effektiv in ein INNER JOIN
umwandeln und Zeilen mit der Anzahl Null auslassen.
Dieses Problem tritt häufig auf, wenn Filterbedingungen basierend auf der richtigen Tabelle in die WHERE
-Klausel eingefügt werden. Betrachten Sie dieses Beispiel:
<code class="language-sql">SELECT o.name AS organisation_name, COALESCE(COUNT(exam_items.id)) AS total_used FROM organisations o LEFT JOIN exam_items e ON o.id = e.organisation_id WHERE e.item_template_id = #{sanitize(item_template_id)} AND e.used = true GROUP BY o.name ORDER BY o.name</code>
Die WHERE
-Klausel filtert exam_items
nach bestimmten item_template_id
und used = true
. Dies filtert nach der Verknüpfung und entfernt Zeilen aus organisations
, die keine übereinstimmenden Zeilen in exam_items
haben, die diese Bedingungen erfüllen.
Die Lösung: Filterung auf die JOIN-Bedingung verlagern
Um alle Zeilen von organisations
beizubehalten, auch diejenigen ohne übereinstimmende Zeilen in exam_items
, verschieben Sie die Filterbedingungen von der WHERE
-Klausel in die JOIN
-Klausel:
<code class="language-sql">SELECT o.name AS organisation_name, COUNT(e.id) AS total_used FROM organisations o LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used = true GROUP BY o.name ORDER BY o.name</code>
Jetzt erfolgt die Filterung während der Verknüpfung. Nur exam_items
Zeilen, die die Kriterien erfüllen, werden für den Join berücksichtigt. organisations
Zeilen ohne übereinstimmende Zeilen werden weiterhin einbezogen, was zu total_used
Werten von 0 führt.
Weitere Optimierung: COUNT() und COALESCE
Die ursprüngliche Abfrage verwendet COALESCE(COUNT(exam_items.id))
. Das ist überflüssig. COUNT()
kehrt nie zurück NULL
; es gibt 0 zurück, wenn keine Zeilen übereinstimmen. Daher ist COALESCE
unnötig und kann zur Verbesserung der Abfrageeffizienz entfernt werden.
Das obige ist der detaillierte Inhalt vonWarum gibt mein PostgreSQL LEFT JOIN keine Zeilen mit einer Anzahl von 0 zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!