Ein häufiges Problem bei der Verwendung von LEFT JOINs ist, dass für bestimmte Gruppen keine Nullanzahl zurückgegeben wird. Dies tritt häufig auf, wenn Filterbedingungen in der WHERE-Klausel statt in der JOIN-Klausel platziert werden. Dieses Beispiel zeigt, wie ein LEFT JOIN korrekt strukturiert wird, um sicherzustellen, dass alle Organisationen einbezogen werden, auch solche mit einer Nullanzahl.
Das Problem entsteht durch die falsche Platzierung von WHERE-Klauseln. Betrachten Sie diese korrigierte Abfrage:
<code class="language-sql">LEFT JOIN exam_items e ON e.organisation_id = o.id AND e.item_template_id = #{sanitize(item_template_id)} AND e.used</code>
Durch das Platzieren von Filterbedingungen (e.item_template_id
, e.used
) innerhalb der JOIN-Klausel wird sichergestellt, dass nur übereinstimmende Zeilen verbunden werden. Zuvor wurde durch die Platzierung dieser Bedingungen in der WHERE-Klausel versehentlich der LEFT JOIN in einen INNER JOIN umgewandelt, wodurch Organisationen ohne übereinstimmende Einträge ausgeschlossen wurden.
Es ist wichtig zu verstehen, dass COUNT(*)
und COUNT(e.id)
immer einen numerischen Wert (0 oder größer) zurückgeben, im Gegensatz zu anderen Aggregatfunktionen, die möglicherweise NULL zurückgeben. Daher ist die Verwendung von COALESCE
zur Verarbeitung von NULL-Werten in diesem Fall nicht erforderlich.
Für Szenarien, in denen die Mehrheit der exam_items
Zeilen gezählt wird, wird eine Leistungssteigerung durch Voraggregieren der Zählungen erreicht:
<code class="language-sql">LEFT JOIN ( SELECT organisation_id AS id -- aliased for simpler join , COUNT(*) AS total_used -- COUNT(*) is generally faster FROM exam_items WHERE item_template_id = #{sanitize(item_template_id)} AND used GROUP BY 1 ) e USING (id)</code>
Dieser optimierte Ansatz aggregiert zunächst die Zählungen von exam_items
und führt dann eine einfachere Verknüpfung mit der Organisationstabelle durch. Dies kann die Abfragegeschwindigkeit erheblich verbessern, insbesondere bei großen Datenmengen.
Das obige ist der detaillierte Inhalt vonWarum gibt mein LEFT JOIN nicht null Zählungen für Organisationen zurück?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!