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中文网其他相关文章!