GROUP_CONCAT更改GROUP BY顺序

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订单.这是正常的吗?

Qua*_*noi 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
Run Code Online (Sandbox Code Playgroud)


Rgo*_*ike 5

订购GROUP_CONCAT怎么样?

SELECT value1, GROUP_CONCAT(value1 ORDER BY date DESC)   
FROM table1  
GROUP BY value1;
Run Code Online (Sandbox Code Playgroud)

这就是你需要假设的语法.


zer*_*kms 1

这是因为 mysql 不保证对于聚合函数中未使用或未用于分组依据的字段将返回哪些确切行。

需要明确的是,“成熟”的 RDBMS(例如 postgre、sql server、oracle)不允许在GROUP BY(或任何没有聚合或未在 中指定的字段GROUP BY)中指定 * - 这是很大的“限制”。