【问题标题】:MySQL GROUP_CONCAT and ORDER and merging columns help pleaseMySQL GROUP_CONCAT 和 ORDER 以及合并列请帮助
【发布时间】: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 中绝对有必要这样做吗?如果没有,您可能会发现使用通用语言会更容易。

标签: mysql csv group-concat


【解决方案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 \”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-11
  • 2013-02-04
  • 1970-01-01
  • 2011-12-06
  • 2011-10-29
相关资源
最近更新 更多