【问题标题】:Ordering in a MySQL GROUP_CONCAT with a function in it在带有函数的 MySQL GROUP_CONCAT 中排序
【发布时间】: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 如果我的答案是正确答案,可以将其标记为正确答案吗?似乎对其他人很有帮助。

标签: sql mysql sql-order-by group-concat


【解决方案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 docsSELECT 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
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 2016-02-14
      • 2012-11-26
      • 2013-04-12
      • 1970-01-01
      • 2014-09-27
      • 2011-05-26
      • 2016-05-31
      • 1970-01-01
      相关资源
      最近更新 更多