SQL COUNT 故障排除:為什麼它計算所有行而不是不同的行
本文解決了一個常見的 SQL 問題:COUNT
函數傳回總行數而不是不同計數。我們將分析有問題的 SQL 語句並展示如何修正它。
以下 SQL 查詢旨在對單一行進行計數,但它錯誤地對所有行進行計數:
<code class="language-sql">SELECT `ID`, `To`, `Poster`, `Content`, `Time`, ifnull(`Aura`, 0) AS `Aura` FROM ( SELECT * FROM ( SELECT DISTINCT * FROM messages m INNER JOIN ( SELECT Friend2 AS Friend FROM friends WHERE Friend1 = '1' UNION ALL SELECT Friend1 AS Friend FROM friends WHERE Friend2 = '1' ) friends ON m.Poster = friends.`Friend` UNION ALL SELECT DISTINCT *, '1' FROM messages WHERE `Poster` = '1' ) var LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus) ) final GROUP BY `ID`, `Poster` ORDER BY `Time` DESC LIMIT 10;</code>
問題出在LEFT JOIN
子查詢。 它缺少一個關鍵的 GROUP BY
子句。沒有 COUNT(*)
的 GROUP BY
函數會聚合 messages_aura
中的所有行。
要解決此問題,我們需要在 GROUP BY
子查詢中新增 LEFT JOIN
子句:
<code class="language-sql">LEFT JOIN ( SELECT `ID` AS `AuraID`, `Status` AS `AuraStatus`, COUNT(*) AS `Aura` FROM messages_aura GROUP BY AuraID, AuraStatus ) aura ON (var.Poster = aura.AuraID AND var.ID = aura.AuraStatus)</code>
修訂後的 LEFT JOIN
現在可以在應用 AuraID
函數之前按 AuraStatus
和 COUNT(*)
將結果正確分組。這可確保 COUNT
函數對 AuraID
和 AuraStatus
的不同組合進行操作,從而產生所需的單獨行計數。 然後,更正後的查詢將按預期準確計算不同的行。
以上是為什麼我的 SQL COUNT 函數計算所有行而不是不同的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!