【问题标题】:SQL GROUP BY multiple columns?SQL GROUP BY 多列?
【发布时间】:2011-10-21 20:51:03
【问题描述】:

我有一个表,我需要按两个不同的列对条目进行分组

这是我的代码

SELECT *
    FROM (
        SELECT max(user_msg.id) AS mid, max(user_msg.timestamp) AS tsp, user_msg.text, 
        usr1.id AS u1_id, usr1.nickname AS u1_nickname, usr1.avatar AS u1_avatar, usr1.avatar_art AS u1_avatar_art, 
        usr2.id AS u2_id, usr2.nickname AS u2_nickname, usr2.avatar AS u2_avatar, usr2.avatar_art AS u2_avatar_art,
        COUNT(user_msg.id) AS cnt
        FROM user_msg 
        join user using (client_id)
        LEFT JOIN user AS usr1 ON user_msg.from_id=usr1.id
        LEFT JOIN user AS usr2 ON user_msg.to_id=usr2.id
        WHERE user_msg.to_id = '".$user_id."' AND to_delete='0' OR user_msg.from_id = '".$user_id."' AND to_delete='0'
        group by u1_id, u2_id ORDER by tsp DESC
    ) c 

它应该类似于 group by u1_id AND u2_id

【问题讨论】:

  • 看起来不错。你有什么问题?
  • 这与您的问题无关,但我认为您应该在您的条件周围添加一些括号,例如 (user_msg.to_id = '".$user_id."' AND to_delete='0') OR ( user_msg.from_id = '".$user_id."' AND to_delete='0')
  • 请贴出你得到的错误信息,或者错误的结果。

标签: mysql sql


【解决方案1】:

您需要使用原始列名,而不是别名。它们还没有被处理(嗯,在 SQL Server 中它们不是:不确定 MYSQL)。

...
   WHERE user_msg.to_id = '".$user_id."' AND to_delete='0' OR user_msg.from_id = '".$user_id."' AND to_delete='0'
  group by usr1.id, usr2.id
  ORDER by tsp DESC
...

编辑:MySQL allows aliases in the GROUP BY

所以,我怀疑 GROUP BY 是错误的和模棱两可的,需要像下面的标准 SQL。有无别名

喜欢这个问题:SQL Query not showing expected result

[结束编辑]

请注意,要创建此标准 SQL(或在任何其他 RDBMS 上运行),您需要使用 GROUP BY 中未在聚合中的所有列:

    SELECT
       max(user_msg.id) AS mid, 
       max(user_msg.timestamp) AS tsp, 
       user_msg.text, 
       usr1.id AS u1_id, usr1.nickname AS u1_nickname, usr1.avatar AS u1_avatar, usr1.avatar_art AS u1_avatar_art, 
       usr2.id AS u2_id, usr2.nickname AS u2_nickname, usr2.avatar AS u2_avatar, usr2.avatar_art AS u2_avatar_art,
       COUNT(user_msg.id) AS cnt
    FROM user_msg 
    join user using (client_id)
    LEFT JOIN user AS usr1 ON user_msg.from_id=usr1.id
    LEFT JOIN user AS usr2 ON user_msg.to_id=usr2.id
    WHERE user_msg.to_id = '".$user_id."' AND to_delete='0' OR user_msg.from_id = '".$user_id."' AND to_delete='0'
    GROUP BY 
          user_msg.text, usr1.id, usr1.nickname, usr1.avatar, usr2.avatar_art,
          usr2.id, usr2.nickname, usr2.avatar, usr1.avatar_art
    ORDER by tsp DESC

【讨论】:

  • 和 MySQL does allow 在 GROUP BY 中使用别名:可以使用 AS alias_nameselect_expr 指定别名。别名用作表达式的列名,可用于GROUP BYORDER BYHAVING 子句中。
  • @Andriy M:查看我之前的编辑(不是我添加 3 列的那个)我检查了 MySQL 文档并澄清这是一个 GROUP BY 歧义而不是别名问题stackoverflow.com/posts/6973710/revisions
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 1970-01-01
  • 2023-02-11
  • 2014-09-28
  • 1970-01-01
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多