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 进行更新