在带有函数的 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; 如果columnNamesomeColumn 相同,你可以只做一个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函数

MySQL的group_concat聚集函数到HGDB的迁移

MySQL的group_concat聚集函数到HGDB的迁移

MySQL:带有LEFT JOIN的GROUP_CONCAT

MySQL:带有 ORDER BY COUNT 的 GROUP_CONCAT?

MariaDB:带有子查询的 group_concat 失败