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
在 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