【问题标题】:Fail to select with count, group by, order by and union in MysqlMysql中count、group by、order by和union选择失败
【发布时间】:2016-05-23 18:07:52
【问题描述】:

我有以下三个表:

theUser(*user_id*, user_name)
ichat(*message_id*, sender, receiver, send_time)
gchat(*message_id*, sender, receiver, send_time)

ichat 和 gchat 的唯一区别是,ichat 中的receiver 是用户,gchat 中是组。但这对这个问题没有影响。

现在我想找出最活跃的n 用户(用户名和相应的发送消息数),这意味着谁出现在sender 中的频率最高。以下是我尝试过的代码:

    SELECT COUNT(totalM.*) AS msge, u.name
    FROM (
        SELECT * FROM gchat
        UNION ALL
        SELECT * FROM ichat) AS totalM
    JOIN theUser u ON totalM.sender=u.user_id
    GROUP BY totalM.sender
    ORDER BY COUNT(*)

但是遇到了这样的错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '*) AS msge, u.name.

你有什么想法吗?提前谢谢!

【问题讨论】:

  • 尝试count(*) 而不是count (totalM.*) 计数应该是一样的吧?因为它是 1-1 关系,所以我认为引擎不喜欢尝试计算连接一侧的记录。并且您的分组依据应与选择的非聚合列匹配。

标签: mysql select group-by sql-order-by union


【解决方案1】:
 SELECT COUNT(*) AS msge, u.name
    FROM (
        SELECT * FROM gchat
        UNION ALL
        SELECT * FROM ichat) AS totalM
    JOIN theUser u ON totalM.sender=u.user_id
    GROUP BY u.Name
    ORDER BY COUNT(*)
  1. GROUP BY 应匹配非聚合选择列
  2. 我相信引擎无法计算表连接的一侧。它在开始计数之前不知道关系是 1-1 还是 1-M,因此它必须计算两边,因此 count(*)。

或者您可以将两个 count(*) 都切换为 count(1) 以获得我相信的相同效果。

【讨论】:

  • 谢谢,它有效!但为什么应该是GROUP BY u.Name 而不是totalM.sender
  • u.name 在选择中。 totalm.sender 不是。我知道它们净值相同,但您应该按您选择的内容进行分组! (非汇总)
  • @user5779223 如果您有多个同名用户,按名称分组将合并他们的计数;所以你可能仍然想按 user_id|sender 分组;但是,如果是这种情况,只有少数情况下您不想选择 user_id。
  • 点头@uuerrdo 是的,你是对的。 user5779223,如果您有多个同名用户,您可能希望将 u.name 和 user_ID 添加到 select/group by。否则,您无法区分一个用户和另一个用户是否具有相同的名称和计数。
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多