MySQL group_concat() 按 case 语句值排序

MySQL group_concat() ordering by case statement values

在 MySQL group_concat() 子句中,我试图对 case 语句的结果值进行排序。以下查询配置对 things.name 进行了正确排序,但未对同一上下文中的 'Non-US' 或 'Unknown' 值进行排序。

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" 排序?

会话变量可能有效,但我不确定 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。

您可以通过按列位置而不是列名称排序来实现。

对于你的情况 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