5

我有一个 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

如果我应用 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 顺序。这是正常的吗?

4

3 回答 3

5

How about ordering your GROUP_CONCAT?

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

That's the syntax you need a presume.

于 2011-10-18T17:15:17.000 回答
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
于 2011-03-25T12:48:14.527 回答
1

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

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

于 2011-03-25T12:46:05.920 回答