我编写了以下MySQL查询。但是,我需要在加入FIND_IN_SET
表的子查询中移动actions
where子句。
这可能吗?当我尝试在子查询中移动该部分时,它会给我错误,paths
列不存在。
select
users_roles.role_id,
ar.actions,
a.paths
from users_roles
join
(
select
action_id,
role_id,
group_concat(action_id SEPARATOR ',') as actions
from actions_roles
) as ar on ar.role_id = users_roles.role_id
join
(
select
id,
group_concat(path SEPARATOR ',') as paths
from actions
) as a on a.id = ar.action_id
where
users_roles.user_id = 1 and FIND_IN_SET('/admin', paths);
答案 0 :(得分:2)
有可能,试试这个:
select
users_roles.role_id,
ar.actions,
a.paths
from users_roles
join
(
select
action_id,
role_id,
group_concat(action_id SEPARATOR ',') as actions
from actions_roles
) as ar on ar.role_id = users_roles.role_id
join
(
select
id,
group_concat(path SEPARATOR ',') as paths
from actions
having FIND_IN_SET('/admin', group_concat(path SEPARATOR ',')) > 0
) as a on a.id = ar.action_id
where
users_roles.user_id = 1
由于您传递给函数的paths
列实际上是子查询中group_concat()
函数的结果,所以您需要做的就是在...中添加HAVING
子句子查询并使用函数的实际调用更改列的别名,您也可以使用它来生成数据。
为什么HAVING
而不是WHERE
?
因为您正在验证group_concat()
这是一个聚合函数的结果。并且只能通过HAVING
子句过滤聚合函数的结果。