MySQL在子查询中移动where子句

时间:2015-08-06 08:26:34

标签: mysql sql

我编写了以下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);

1 个答案:

答案 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子句过滤聚合函数的结果。