我有一个 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/