MySQL GROUP_CONCAT和ORDER以及合并列有用

时间:2012-02-08 23:56:06

标签: mysql csv group-concat

我已经把头发拉了两天试图将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-∞.com。与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搜索&取代结果。非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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的值。

答案 1 :(得分:0)

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

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

group_concat的排序取决于你。

这是example

希望这有帮助。