【问题标题】:SQL counting all rows instead of counting individual rowsSQL 计算所有行而不是计算单个行
【发布时间】:2014-08-25 02:55:25
【问题描述】:

我有一个从数据库请求数据的 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

这是我的messages_aura 表格布局。它显示IDStatusUserID

这是上述语句的输出。

(上面截图中的ID指的是下面的Poster,上面截图中的Status指的是下面的ID

该语句应为底行的 Aura 计数 1 和顶行的 Aura 计数 2。怎么了?

【问题讨论】:

  • 子查询中需要GROUP BY,不是吗?
  • 你是对的!谢谢,我不敢相信这很容易xD
  • 我不敢相信这个问题如此普遍。我们可能必须每天多次发布这种答案。
  • mySQL 对 group by 的扩展支持是 (IMO) 大多数使用聚合和 mysql 的开发人员面临的最大问题。这个extended support 会给大多数人带来麻烦。我认为我们最好默认禁用该功能。数据库通过一个不带分组依据的聚合来隐藏 ANSII 标准 SQL 错误。

标签: mysql sql


【解决方案1】:

您缺少GROUP BY,因此它会计算所有内容,而不是按某些列分组。

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-17
    • 2022-11-17
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    相关资源
    最近更新 更多