mysql - GROUP_CONCAT 改变 GROUP BY 顺序

标签 mysql group-concat

我有一个 View (很多连接)输出按日期 ASC 排序的数据。按预期工作。

输出类似于:

ID date         tag1   other_data
1  25-03-2011   blue   fff   <=
1  26-03-2011   red    ggg
1  27-03-2011   pink   yyy
2  25-03-2011   red    yyy   <=
2  26-03-2011   orange rrr

如果我应用 GROUP BY ID。对于其他列,MySQL 输出每个 ID 的第一个找到的行。我在 te 文档的某个地方读到了这个。

SELECT * FROM `myVIEW`  
GROUP BY `ID`  
  ID date         tag1  other_data  
  1  25-03-2011   blue   fff   <=
  2  25-03-2011   red    yyy   <=

现在让我们添加一个 GROUP_CONCAT(tags1)

SELECT *,CONCAT_GROUP(`tag1`) AS `tags`  
FROM `myVIEW`  
GROUP BY `ID`

由于我应用了 CONCAT_GROUP,结果变得很奇怪。我期待:

ID date         tag1   other_data   tags
1  25-03-2011   blue   fff          blue,red,pink
2  25-03-2011   red    yyy          red,orange

查询正在返回,例如:

ID date         tag1   other_data   tags
1  26-03-2011   red    ggg          blue,red,pink
2  25-03-2011   red    yyy          red,orange

看起来 GROUP_CONCAT 不再保留 VIEW 顺序。这正常吗?

最佳答案

Looks like GROUP_CONCAT no longer preserves the VIEW order. Is this normal?

是的,这很正常。

您永远不应依赖未分组和未聚合字段的返回顺序。

GROUP_CONCAT 有自己的 ORDER BY 子句,优化器会考虑该子句并可以更改解析记录的顺序。

要返回第一条记录以及 GROUP_CONCAT,请使用:

SELECT  m.*, gc
FROM    (
        SELECT  id, MIN(date) AS mindate, GROUP_CONCAT(tags) AS gc
        FROM    myview
        GROUP BY
                id
        ) md
JOIN    m.*
ON      m.id = md.id
        AND m.date = md.mindate

关于mysql - GROUP_CONCAT 改变 GROUP BY 顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5432547/

相关文章:

c# - 如何保护与 MySql 服务器的连接

MySQL:如何将列别名与特定的 JOIN 子句相关联

MySQL Group 和 Concat 多列

mysql - 将多行连接成一行

php - 访问 http 时拒绝访问 ://localhost/phpmyadmin/page

mysql - 组数据限制

mysql - 根据另一个表中选定的行过滤一个表中的记录集

php - group_concat : have values display in a new line on the browser

mysql - 组合这两个 mySQL 查询

mysql - 如果发现一个逗号分隔记录与另一逗号分隔记录匹配,则获取记录