从子查询结果中 进行 GROUP_CONCAT ... ORDER BY 操作,会报列不存在的错误

【 TiDB 使用环境】生产环境
【 TiDB 版本】TiDB6.1
【复现路径】
sql1: 此sql执行会报错:

> 1105 - Can't find column Column#57 in schema Column: [pre_dim.dim_performance_roster_month.role_id,pre_dim.dim_performance_roster_month.role_name,pre_dim.dim_performance_roster_month.role_id,pre_dim.dim_performance_roster_month.role_name] Unique key: []
SELECT 
	GROUP_CONCAT(DISTINCT `role_id` ORDER BY `role_id` ASC SEPARATOR '&&' ) role_ids,
	GROUP_CONCAT(DISTINCT `role_name` ORDER BY `role_id` ASC SEPARATOR '&&' ) role_names
FROM(
	SELECT 
		COALESCE(b.role_id,a.role_id) role_id
		,COALESCE(b.role_name,a.role_name) role_name
	FROM pre_dim.`dim_performance_roster_month` a
	LEFT JOIN pre_dim.`dim_performance_roster_month` b ON a.user_id = b.user_id
) a1

sql2: 此sql执行(删去了order by …)没问题,无报错

SELECT 
	GROUP_CONCAT(DISTINCT `role_id` ) role_ids,
	GROUP_CONCAT(DISTINCT `role_name` ) role_names
FROM(
	SELECT 
		COALESCE(b.role_id,a.role_id) role_id
		,COALESCE(b.role_name,a.role_name) role_name
	FROM pre_dim.`dim_performance_roster_month` a
	LEFT JOIN pre_dim.`dim_performance_roster_month` b ON a.user_id = b.user_id
) a1

sql3: 把子查询放入一个表中(test.test_dim_performance_roster_month),再去查,没问题

SELECT 
	GROUP_CONCAT(DISTINCT `role_id` ORDER BY `role_id` ASC SEPARATOR '&&' ) role_ids,
	GROUP_CONCAT(DISTINCT `role_name` ORDER BY `role_id` ASC SEPARATOR '&&' ) role_names
FROM(
	SELECT * from test.test_dim_performance_roster_month
) a1

【遇到的问题:问题现象及影响】
【资源配置】
【附件:截图/日志/监控】

各位大神 求助~ 为何啊?

MySQL 报错么

WITH t
AS (
SELECT
COALESCE(b.role_id,a.role_id) role_id
,COALESCE(b.role_name,a.role_name) role_name
FROM pre_dim.dim_performance_roster_month a
LEFT JOIN pre_dim.dim_performance_roster_month b ON a.user_id = b.user_id
) a1
SELECT
GROUP_CONCAT(DISTINCT role_id ORDER BY role_id ASC SEPARATOR ‘&&’ ) role_ids,
GROUP_CONCAT(DISTINCT role_name ORDER BY role_id ASC SEPARATOR ‘&&’ ) role_names
FROM a1;
好像确认有这个问题,这样写就没问题

这样写 没法执行呢,说语法错误?

WITH t AS (
	SELECT COALESCE
		( b.role_id, a.role_id ) role_id,
		COALESCE ( b.role_name, a.role_name ) role_name 
	FROM
		pre_dim.dim_performance_roster_month a
		LEFT JOIN pre_dim.dim_performance_roster_month b ON a.user_id = b.user_id 
	) SELECT
	GROUP_CONCAT( DISTINCT role_id ORDER BY role_id ASC SEPARATOR '&&' ) role_ids,
	GROUP_CONCAT( DISTINCT role_name ORDER BY role_id ASC SEPARATOR '&&' ) role_names 
FROM
	t;

这样写就行,厉害,谢谢~ 不过 这是为什么? bug 么

我还发现,如果我的sql1 中的COALESCE函数 去掉的话,也没问题了。。。

看起来是:当GROUP_CONCAT+ORDER BY 碰上 “带有空值判断函数的子查询” 时,会有报错? bug 么?

在tidb3.0 里没问题。。。。为啥????懵逼

因为tidb后来的版本对GROUP_CONCAT这个函数进行了重写,mysql也是没有这个问题的。

你咋知道的。。。 :joy:

看了源码呀,不过我没看出来是哪造成了这个bug,不过tidb确实是改写了这个函数,而且3.0后面的版本和3.0之前改写的还不一样

厉害了 :+1:

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。