Heim >Datenbank >MySQL-Tutorial >Warum gibt mein LEFT JOIN nicht null Zählungen für Organisationen zurück?

Warum gibt mein LEFT JOIN nicht null Zählungen für Organisationen zurück?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-14 11:14:42639Durchsuche

Why Doesn't My LEFT JOIN Return Zero Counts for Organizations?

Fehlerbehebung bei LEFT JOIN-Abfragen: Nullzählungen und Optimierung

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.

Korrektur des LEFT JOIN

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.

COUNT(e.id) Verhalten

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.

Leistungsoptimierung: Vor dem Beitritt aggregieren

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn