MySQL GROUP_CONCAT 和 ORDER 以及合并列请帮助

Posted

技术标签:

【中文标题】MySQL GROUP_CONCAT 和 ORDER 以及合并列请帮助【英文标题】:MySQL GROUP_CONCAT and ORDER and merging columns help please 【发布时间】:2012-03-01 11:41:45 【问题描述】:

这两天我一直在努力尝试将 mysql 查询放在一起以将一些数据放在一起。然而,这超出了我对 SQL 的经验水平。

以下查询提取了我需要的数据,但我需要对其进行不同的格式化,以便可以使用它。

SELECT b.key, a.author, a.comment FROM action a, issue b 
WHERE a.issueid=b.id AND a.actiontype='comment';

这会产生如下输出:

1 | joe | comment 3
3 | sally | comment 2
1 | sam | comment 2
2 | julie | comment 2
1 | bill | comment 1
3 | joe | comment 1
2 | sam | comment 1

b.key 是唯一的,可以包含 0-∞ a.comment。与 a.author 和 a.comment 是 1-1 的关系,我必须保持原来的关联。输出似乎是根据 a.comment 的日期升序排列的。

我希望将数据转换为以下格式 (CSV),将 a.author 和 a.comment 结果合并到一个列中:

"1", "bill - comment 1", "sam - comment 2", "joe - comment 1"
"2", "julie - comment 1", "sam - comment 2"
"3", "joe - comment 1", "sally - comment 2"

我玩弄了 GROUP_CONCAT 和 ORDER 的几种组合,还根据this 发布了一些子查询,似乎无法按照我需要的方式对其进行格式化。此外,评论栏的顺序似乎发生了变化。我需要维护原始(从最旧到最新)顺序,但是我上面的原始查询会以最新到最旧的顺序产生结果。如果分隔符有问题,我当然可以使用 perl 或 awk 搜索和替换结果进行一些后期处理。非常感谢任何帮助!

【问题讨论】:

在 MySQL 中绝对有必要这样做吗?如果没有,您可能会发现使用通用语言会更容易。 【参考方案1】:

怎么样

SELECT
    issue.key,
    GROUP_CONCAT(CONCAT(action.author, ' - ', action.comment) ORDER BY action.created ASC SEPARATOR '|')
FROM action
INNER JOIN issue
    ON action.issueid = issue.id
WHERE action.actiontype = 'comment'
GROUP BY issue.key;

根据管道字符进行一些后期处理。如果遇到截断问题,您可能需要增加 group_concat_max_len 的值。

【讨论】:

谢谢!我不得不稍微修改一下,但这满足了我的需要。【参考方案2】:

看看这个。联接不会以任何方式影响数据的显示方式,因此我正在编写查询,就好像您的表实际上是您显示为输出的表一样

select concat('"', id, '", ',
  group_concat(concat('"', author, ' - ', comment, '"') separator ", ")
) as result from table1
group by id

group_concat 的顺序由你决定。

这是example。

希望这会有所帮助。

【讨论】:

感谢您在结果中添加字符的提示。 '"' 不起作用,但我使用这个概念插入了其他可以在后期处理中替换的字符。 这很奇怪,因为该示例准确地显示了您要查找的内容 我正在从 mysql -e 运行它,所以这可能与 shell 解释行中 " 的方式有关。无论如何我需要对数据进行后处理以去除换行符,所以我可以用“ 哦,你没有在问题中提到这一点。是的,您可能必须转义“ with \”

以上是关于MySQL GROUP_CONCAT 和 ORDER 以及合并列请帮助的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用 JOIN 和 GROUP_CONCAT

MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新

Mysql 中的group_concat函数的使用及陷阱

Mysql 中的group_concat函数的使用及陷阱

MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT

当我在查询中使用“GROUP_CONCAT”和“HAVING”时如何计算 MySQL 结果?