MySQL group_concat() 按 case 语句值排序

Posted

技术标签:

【中文标题】MySQL group_concat() 按 case 语句值排序【英文标题】:MySQL group_concat() ordering by case statement values 【发布时间】:2015-09-26 23:24:46 【问题描述】:

mysql group_concat() 子句中,我试图对 case 语句的结果值进行排序。以下查询配置正确排序things.name,但未在同一上下文中排序“非美国”或“未知”值。

SELECT 
  things.id
  ,group_concat(DISTINCT 
    CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END
  ORDER BY name SEPARATOR ', ')
FROM things
GROUP BY things.id

我想做这样的事情,但它不起作用:

SELECT 
  things.id
  ,group_concat(DISTINCT 
    (CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END) AS new_name
  ORDER BY new_name SEPARATOR ', ')
FROM things
GROUP BY things.id

有没有办法在不使用子查询/嵌套查询的情况下按“new_name”排序?

【问题讨论】:

如果它不接受ORDER BY 中的别名new_name,它仍然应该接受整个CASE 表达式为GROUP_CONCAT(DISTINCT CASE...END ORDER BY CASE WHEN things.name....END SEPARATOR ', ') 这会很难看,但值得一试。否则你可能需要一个子查询来将排序值填充到一个真实的列中。 子查询会比我下面的答案更清晰;尽管对 id 字段进行分组意味着您根本不需要 GROUP_CONCAT()。 本示例中的 id 字段只是出于说明目的而放入其中(也许不是最佳选择)。真正的查询是不同的。 【参考方案1】:

您可以通过按列位置而不是列名进行排序。

对于您的情况,ORDER BY 1 应该可以工作。

SELECT 
  things.id
  ,group_concat(DISTINCT 
    CASE
    WHEN things.name <> 'United States' THEN 'Non-US'
    WHEN things.name IS NULL THEN 'Unknown'
    ELSE things.name
    END
  ORDER BY 1 SEPARATOR ', ')
FROM things
GROUP BY things.id

【讨论】:

啊,我希望这就是手册语法定义中的 unsigned_integer 位实际所指的内容。但是说明书没有说明!顺便说一句,它实际上不是 column 位置,因为它不是 SELECT 或表的一部分;它只是表达式在 GROUP_CONCAT 参数列表中的位置,如果它确实是这样工作的。【参考方案2】:

会话变量可能会起作用,但我不确定 GROUP_CONCAT() 中的评估顺序:

SELECT 
  things.id
  , group_concat(DISTINCT 
      @new_name := (CASE
        WHEN things.name <> 'United States' THEN 'Non-US'
        WHEN things.name IS NULL THEN 'Unknown'
        ELSE things.name
        END
      ) ORDER BY @new_name SEPARATOR ', ')
FROM things
GROUP BY things.id
;

如果这不起作用,您可以尝试在 ORDER BY 部分中进行分配,并在 pre-ORDER BY 中使用 @new_name。

【讨论】:

以上是关于MySQL group_concat() 按 case 语句值排序的主要内容,如果未能解决你的问题,请参考以下文章

MySQL group_concat() 按 case 语句值排序

MYSQL group_concat

MYSQL 合计每月值加上 group_concat

向 mySQL GROUP_CONCAT 语句添加内连接

mysql group_concat()函数 长度限制修改办法

如何按(多个值)中的位置对 GROUP_CONCAT 列进行排序?