首頁 > 資料庫 > mysql教程 > 為什麼我的 LEFT JOIN 不傳回組織的零計數?

為什麼我的 LEFT JOIN 不傳回組織的零計數?

Patricia Arquette
發布: 2025-01-14 11:14:42
原創
638 人瀏覽過

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

LEFT JOIN 查詢故障排除:零計數與最佳化

使用 LEFT JOIN 時的常見問題是無法為某些群組傳回零計數。 當過濾條件放在 WHERE 子句而不是 JOIN 子句中時,經常會發生這種情況。 此範例示範如何正確建置 LEFT JOIN 以確保包含所有組織,即使是那些計數為零的組織。

更正 LEFT JOIN

問題是由於錯誤地放置了 WHERE 子句而產生的。 考慮這個更正後的查詢:

<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>
登入後複製

將篩選條件(e.item_template_ide.used)放置在 JOIN 子句中可確保僅連接符合的行。 先前,將這些條件放在 WHERE 子句中無意中將 LEFT JOIN 轉換為 INNER JOIN,排除了沒有符合條目的組織。

COUNT(e.id) 行為

了解 COUNT(*)COUNT(e.id) 始終返回數值(0 或更大)這一點至關重要,這與其他可能返回 NULL 的聚合函數不同。 因此,在這種情況下,不需要使用 COALESCE 來處理 NULL 值。

效能最佳化:加入前聚合

對於大多數 exam_items 行進行計數的場景,透過預先聚合計數來實現效能增強:

<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>
登入後複製

這種最佳化方法首先聚合來自 exam_items 的計數,然後與組織表執行更簡單的聯接。這可以顯著提高查詢速度,尤其是對於大型資料集。

以上是為什麼我的 LEFT JOIN 不傳回組織的零計數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板