2012-02-08 84 views
1

我一直拉我的頭髮兩天試圖把MySQL查詢一起拉一些數據在一起。然而,這超出了我對SQL的使用經驗。MySQL GROUP_CONCAT和訂單和合並列的幫助請

以下查詢會提取我需要的數據,但我需要以不同的格式對其進行格式化,以便可以使用它。

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搜索&來替換結果。任何幫助是極大的讚賞!

+0

在MySQL中完成它是絕對必要的嗎?如果不是,用通用語言可能會更容易。 – 2012-02-09 01:30:05

回答

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的值。

+0

謝謝!我不得不稍微修改一些東西,但是這樣做了我所需要的。 – 2012-02-09 18:46:44

0

檢查了這一點。在參加以任何方式不影響數據的顯示,所以我寫了查詢,就好像你的表實際上是你作爲顯示輸出

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

的GROUP_CONCAT的順序是由你的人。

這是example

希望這會有所幫助。

+0

感謝您向結果中添加字符的提示。 '''沒有用,但我用這個概念來插入其他字符,我可以在後期處理中替換。 – 2012-02-09 18:47:46

+0

這很奇怪,因爲這個例子顯示了你正在尋找的東西 – 2012-02-09 18:50:32

+0

我從mysql運行這個-e所以它可能與shell解釋「排隊」的方式有關。我需要發佈處理數據以刪除換行,所以我可以用「 – 2012-02-09 18:55:09