我有一个VIEW(很多连接)输出按日期ASC排序的数据。按预期工作。
OUTPUT类似于:
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 docs中的某处读过这篇文章。
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订单。这是正常的吗?
答案 0 :(得分:5)
看起来
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
答案 1 :(得分:5)
如何订购GROUP_CONCAT?
SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC)
FROM table1
GROUP BY value1;
这就是你需要假设的语法。
答案 2 :(得分:1)
这是因为mysql不保证将为聚合函数中未使用的字段返回确切的行,或者不用于分组。
要明确“成熟”的rdbms(例如postgre,sql server,oracle)不允许在GROUP BY
中指定*(或者没有聚合的任何字段或GROUP BY
中未指定的字段) - 这是很好的“限制”。