cma*_*cre 5 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
Run Code Online (Sandbox Code Playgroud)
如果我申请GROUP BY ID.对于其他列,MySQL输出每个ID的第一个找到的行.我在te docs的某个地方读到了这个.
SELECT * FROM `myVIEW`
GROUP BY `ID`
ID date tag1 other_data
1 25-03-2011 blue fff <=
2 25-03-2011 red yyy <=
Run Code Online (Sandbox Code Playgroud)
现在让我们添加一个GROUP_CONCAT(tags1)
SELECT *,CONCAT_GROUP(`tag1`) AS `tags`
FROM `myVIEW`
GROUP BY `ID`
Run Code Online (Sandbox Code Playgroud)
由于我应用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
Run Code Online (Sandbox Code Playgroud)
查询正在返回,例如:
ID date tag1 other_data tags
1 26-03-2011 red ggg blue,red,pink
2 25-03-2011 red yyy red,orange
Run Code Online (Sandbox Code Playgroud)
看起来GROUP_CONCAT不再保留VIEW订单.这是正常的吗?
看起来
GROUP_CONCAT不再保留VIEW订单.这是正常的吗?
是的,这是正常的.
您不应该依赖于返回未分组和未分段字段的顺序.
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
Run Code Online (Sandbox Code Playgroud)
订购GROUP_CONCAT怎么样?
SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC)
FROM table1
GROUP BY value1;
Run Code Online (Sandbox Code Playgroud)
这就是你需要假设的语法.
这是因为 mysql 不保证对于聚合函数中未使用或未用于分组依据的字段将返回哪些确切行。
需要明确的是,“成熟”的 RDBMS(例如 postgre、sql server、oracle)不允许在GROUP BY(或任何没有聚合或未在 中指定的字段GROUP BY)中指定 * - 这是很大的“限制”。