2011-03-25 50 views
5

我有一个观点(很多加入的),通过日期ASC有序输出数据。按预期工作。GROUP_CONCAT变化GROUP BY为了

输出类似于:

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不再保留查看订单。这是正常的吗?

回答

1

这是因为MySQL不保证什么确切的行会为未在聚集函数中使用或不被用于分组的字段返回。

而且是明确的“成熟”的RDBMS(如postgre,SQL服务器,Oracle)不允许指定*在GROUP BY(或无结块或任何字段GROUP BY没有指定) - 这是伟大的“局限性”。

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 
5

如何订购您GROUP_CONCAT?

SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC) 
FROM table1 
GROUP BY value1; 

这就是您需要假设的语法。