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 语句值排序