2009-10-16 50 views
20

我想在GROUP_CONCAT函數中訂購結果。問題是,在GROUP_CONCAT函數的選擇是另一種功能,像這樣(幻想選擇):在具有函數的MySQL GROUP_CONCAT中訂購

SELECT a.name, 
    GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) ORDER BY b.id ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

我想得到這樣(通過b.id訂購)結果:

michael 1:science,2:maths,3:physics 

但我得到:

michael 2:maths,1:science,3:physics 

有誰知道我可以b.id在我GROUP_CONCAT訂購嗎?

+2

[GROUP_CONCAT](http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat)支持它自己的'ORDER BY'條款......不知道用戶定義的函數是或者不會幫助我們能夠幫助你。 – 2011-06-18 22:42:06

+0

這就像我寫的:函數「group_concat」中的函數「concat_ws」。我從來沒有說過它是用戶定義的函數。 – acme 2011-06-20 14:05:33

+0

目前尚不清楚如何編寫有效的解決方案,因爲表格結構,表格之間的內容和關係未指定(即沒有聯接規範)。 – outis 2013-01-31 23:20:53

回答

37

如果有人關心,我想我找到了至少一個類似的問題的解決方案。

http://mahmudahsan.wordpress.com/2008/08/27/mysql-the-group_concat-function/

select GROUP_CONCAT(columnName order by someColumn SEPARATOR '|') from tableName where fieldId = p.id 

通過順序去在GROUP_CONCAT的分離器之前,如果有一個。

+0

好找!感謝分享! – rckehoe 2013-12-18 13:58:16

+0

真棒,這一次拯救了我的生命 – Nadeeshaan 2014-08-03 15:46:30

+0

不錯的一個!!感謝分享 – 2015-09-18 10:23:04

2

我不知道這樣做的標準方法。這個查詢工作,但恐怕只是取決於一些實現細節:

SELECT a_name, group_concat(b_id) 
FROM (
    SELECT a.name AS a_name, b.id AS b_id 
    FROM tbl1 a, tbl2 b 
    ORDER BY a.name, b.id) a 
GROUP BY a_name 
+0

經過一點研究,似乎我問的是不可能的。不過謝謝! – acme 2009-10-19 07:05:32

+0

試過這個,不知何故不起作用 – slier 2014-04-19 22:04:25

0
SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id) 
FROM book_mast 
GROUP BY pub_id 
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC; 
+1

我想在'GROUP_CONCAT'中彙總元素而不是整個結果。 – acme 2012-04-04 11:47:50

0
SELECT generated.name, GROUP_CONCAT(generated.data) 
FROM (
    SELECT people.name, CONCAST_WS(":", stuff.id, courses.name) data 
    FROM people, stuff, courses 
    ORDER BY stuff.id, people.name 
) generated 
GROUP BY generated.name 
2

不需要子選擇。

SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data 
FROM people, stuff, courses 
ORDER BY stuff.id, people.name 
3

我知道這是真的老了,但是剛纔我一直在尋找的答案,@ korny的回答給了我這樣的想法:

SELECT a.name, 
GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) 
      ORDER BY CONCAT_WS(':', b.id, c.name) ASC) AS course 
FROM people a, stuff b, courses c 
GROUP BY a.id 

(和它的作品對我來說,如果不清楚:-))

+0

我並不十分確定,但我相信這與使用GROUP_CONCAT(DISTINCT CONCAT_WS(':',b.id,c.name)ORDER BY 1)''是一樣的。如果它工作的話,這簡單得多! – Doin 2015-12-08 11:21:05

+0

這教會了我新的東西,謝謝! :-) – AMeiri 2015-12-12 21:11:02

+0

是的!真正正確的答案! (當然,沒有人正在做OP的內容!我們在這個頁面上,因爲我們想知道如何在Order By中引用DISTINCT Func(...)的結果,答案是你只需要調用再次Func。) – HoldOffHunger 2016-07-18 20:20:52