我有两个MySQL服务器版本8.0,一个用于本地开发,另一个用于Heroku实例,更确切地说,是在Heroku上,我正在使用名为JAWSDB的服务。
对于我的项目,我必须使用以下CTE查询,因为表tree_structure
的结构是分层的。
查询的目的是,对于tree_structure
中的每一行,我必须获取其所有子级,然后计算该特定行及其子级中user_roles
表中有多少用户
SELECT mtr.id,
mtr.parent_id,
mtr.name,
mtr.manager_id,
CONCAT(users.nome, ' ', users.cognome) as resp_name,
(
with recursive cte (id, name, parent_id) as (
select id,
name,
parent_id
from tree_structure as tr_rec
where tr_rec.parent_id = mtr.id
and tr_rec.session_id = '2018'
union all
select tr.id,
tr.name,
tr.parent_id
from tree_structure as tr
inner join cte
on tr.parent_id = cte.id
WHERE tr.session_id = '2018'
)
select count(distinct (user_id))
from user_roles as ur_count
where ur_count.structure_id in (select distinct(id) from cte)
) as utenti
FROM tree_structure as mtr
LEFT JOIN users ON mtr.manager_id = users.id
WHERE level = 0
问题在于在我的本地服务器上它可以工作,而在heroku实例上却给我以下错误:
unknow columns mtr.id in where clause
。
有人对导致此错误的原因有任何想法吗?
在此先感谢您的英语不好。
答案 0 :(得分:0)
CTE中的表引用不明确:
BacksGas_Flow_sccm ContextID StepID Time_Elapsed Time_ms
104082 1.757812 7325335 3 153.238 08:49:06.900000
205388 1.757812 7324656 2 145.9 07:16:31.660000
105119 1.953125 7290176 1 139.695 09:30:39.170000
表tree_structure用于子选择和最外面的选择。优良作法是为您使用的每个表引用创建唯一的别名。
在这种情况下,您应该输入错字,应该检查层次结构根节点的自引用:
SELECT
....
(with recursive cte (id, name, parent_id) as (
....
from tree_structure as tr_rec -- here you have aliased the table
where tr_rec.id = tree_structure.id -- here you refer to the table and its alias
and tr_rec.session_id = '2018'
union all
....
)
....
) as utenti
....
答案 1 :(得分:0)
好的,我发现了查询错误的原因。显然,从MySQL 8.0.14版本开始,他们引入了对在子查询中使用外部参数的支持。
我的本地版本是8.0.16,而在线版本是8.0.11,因此,因此我的查询无法正常工作。