GROUP_CONCAT更改GROUP BY顺序

时间:2011-03-25 12:42:01

标签: mysql group-concat

我有一个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订单。这是正常的吗?

3 个答案:

答案 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中未指定的字段) - 这是很好的“限制”。