首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL group_concat()按case语句值排序

问MySQL group_concat()按case语句值排序
EN

Stack Overflow用户
提问于 2015-07-08 20:27:38
回答 2查看 8.9K关注 0票数 4

在MySQL group_concat()子句中,我试图对case语句的结果值进行排序。下面的查询配置正确地命令things.name,但没有在相同的上下文中排序“非US”或“未知”值。

代码语言:javascript
复制
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

我想做这样的事,但不管用:

代码语言:javascript
复制
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“排序的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-08 20:47:37

您可以通过按列位置(而不是列名)排序来实现这一点。

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

代码语言:javascript
复制
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
票数 10
EN

Stack Overflow用户

发布于 2015-07-08 20:31:18

会话变量可能会工作,但我不确定GROUP_CONCAT()中的计算顺序:

代码语言:javascript
复制
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
;

如果这样做不起作用,您可以尝试按区段顺序执行赋值,而只需在pre BY中使用@new_name。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31303035

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档