在带有函数的 MySQL GROUP_CONCAT 中排序
Posted
技术标签:
【中文标题】在带有函数的 MySQL GROUP_CONCAT 中排序【英文标题】:Ordering in a MySQL GROUP_CONCAT with a function in it 【发布时间】:2010-12-07 08:44:54 【问题描述】:我想在 GROUP_CONCAT 函数中排序结果。问题是,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
有谁知道我如何在 group_concat 中按 b.id 订购?
【问题讨论】:
GROUP_CONCAT 支持它自己的ORDER BY
子句...不知道用户定义的函数是什么或做什么,将无法帮助我们帮助您。
就像我写的:函数“group_concat”中的函数“concat_ws”。我从未说过这是用户定义的函数。
不清楚如何编写有效的解决方案,因为表结构、内容和表之间的关系未指定(即没有连接规范)。
因为这个问题没必要回答。
@acme 如果我的答案是正确答案,可以将其标记为正确答案吗?似乎对其他人很有帮助。
【参考方案1】:
如果有人关心,我想我至少找到了解决类似问题的方法。
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
如果有分隔符,则 order by 位于分隔符之前的 group_concat 中。
【讨论】:
好发现!!感谢分享! 太棒了,这个救了我的命 不错!!感谢分享 找到了相同的信息 in the docs。SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name
;
如果columnName
和someColumn
相同,你可以只做一个GROUP_CONCAT(columnName ORDER BY 1 SEPARATOR '|')
。【参考方案2】:
我知道这真的很老了,但刚才我正在寻找答案,@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
(如果不清楚的话,它对我有用 :-))
【讨论】:
我不确定,但我相信这与使用GROUP_CONCAT(DISTINCT CONCAT_WS(':', b.id, c.name) ORDER BY 1)
相同。如果可行,那就更简单了!
是的!实际正确答案!!! (当然,没有人完全按照 OP 做事!我们在这个页面上是因为我们想知道如何在 Order By 中引用 DISTINCT Func(...) 的结果,答案是您只需要调用再次运行。)【参考方案3】:
我不知道执行此操作的标准方法。这个查询有效,但恐怕它只取决于一些实现细节:
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
【讨论】:
经过一番研究,我的要求似乎是不可能的。不过还是谢谢!【参考方案4】:不需要子选择。
SELECT people.name, CONCAT_WS(":", stuff.id, courses.name) data
FROM people, stuff, courses
ORDER BY stuff.id, people.name
【讨论】:
【参考方案5】:SELECT pub_id,GROUP_CONCAT(DISTINCT cate_id)
FROM book_mast
GROUP BY pub_id
ORDER BY GROUP_CONCAT(DISTINCT cate_id) ASC;
【讨论】:
我想订购GROUP_CONCAT
中的聚合元素,而不是整个结果。【参考方案6】:
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
【讨论】:
以上是关于在带有函数的 MySQL GROUP_CONCAT 中排序的主要内容,如果未能解决你的问题,请参考以下文章
MySQL的group_concat聚集函数到HGDB的迁移
MySQL的group_concat聚集函数到HGDB的迁移
MySQL:带有LEFT JOIN的GROUP_CONCAT