Mysql 无法访问内部作用域中的变量?

Mysql 无法访问内部作用域中的变量?,mysql,sql,Mysql,Sql,我正在尝试让这段SQL查询正常工作。问题是我无法访问其参数中的内容中的core_user.id。我真的不知道为什么 SELECT core_user.id AS target, ( SELECT COUNT(permission_id) AS permissions FROM ( SELECT DISTINCT permission_id FROM (

我正在尝试让这段SQL查询正常工作。问题是我无法访问其参数中的内容中的core_user.id。我真的不知道为什么

SELECT
    core_user.id AS target, (
        SELECT
            COUNT(permission_id) AS permissions
        FROM (
            SELECT
                DISTINCT permission_id
            FROM (
                SELECT
                    id,
                    permission_id
                FROM
                    core_user_user_permissions
                WHERE
                    core_user_user_permissions.user_id = core_user.id
                UNION
                SELECT
                    id,
                    permission_id
                FROM
                    auth_group_permissions
                WHERE
                    auth_group_permissions.group_id IN (
                        SELECT
                            group_id
                        FROM
                            core_user_groups
                        WHERE
                            core_user_groups.user_id = core_user.id)) AS `permissions`) AS `derived`) AS `perms`
        FROM
            `core_user`
        WHERE
            `core_user`.`is_active` = TRUE
        GROUP BY
            `core_user`.`id`
        ORDER BY
            `perms` ASC
如果我尝试将core_user作为目标的target.id,它也不起作用:“where子句”中的未知列“target.id”

预期成果:

+----------------------------------+-------+
| id                               | perms |
+----------------------------------+-------+
| ab7ec54bf9124dffb807fb89f9ea8036 |    0 |
| b54d4d3f97134dfcbc36ac193c0c1250 |    81 |
| c69ffa4d162b49129ff6a316da3caaa3 |    64 |
| f8ac73eee80044359c246f3b173aa631 |    0 |
+----------------------------------+-------+
知道如何解决这个问题吗?

我会将其改写为:

SELECT core_user.id AS target,
   (SELECT COUNT(permission_id) AS permissions
    FROM (SELECT permission_id
          FROM core_user_user_permissions
          WHERE core_user_user_permissions.user_id = `core_user`.id
          UNION
          SELECT permission_id
          FROM auth_group_permissions
          WHEREauth_group_permissions.group_id IN (
                        SELECT group_id
                        FROM core_user_groups
                        WHERE core_user_groups.user_id = `core_user`.id)
          ) AS `derived`
  ) AS `perms`
FROM `core_user`
WHERE  `core_user`.`is_active` = TRUE
GROUP BY `core_user`.`id`
ORDER BY `perms`;

我已经删除了选择列表中的一级嵌套子查询。

我希望通过排除组前置项,可以得到您期望的结果:

SELECT core_user.id AS target, 
    (
        SELECT COUNT(DISTINCT(permission_id)) AS permissions
        FROM 
        (
            SELECT cuup.id as id, cuup.permission_id as permission_id
            FROM core_user_user_permissions cuup
            -- WHERE cuup.user_id = cu.id  
            --VV-- this should be a join
            JOIN core_user cu ON cu.id = cuup.user_id
        )
    ) AS `perms`
FROM `core_user`
WHERE `core_user`.`is_active` = TRUE
GROUP BY `core_user`.`id`
ORDER BY `perms` ASC

如果只有一个无效的查询,并且没有对它应该检索什么的描述,那么理解一个人想要什么并不容易。所以这只是一个最好的猜测:

SELECT cu.id target,
       count(x.permission_id) perms
       FROM core_user cu
            LEFT JOIN (SELECT cuup.permission_id,
                              cuup.user_id
                              FROM core_user_user_permissions cuup
                              WHERE cuup.permission_id IS NOT NULL
                       UNION
                       SELECT agp.permission_id,
                              cug.user_id
                              FROM auth_group_permissions agp
                                   INNER JOIN core_user_groups cug
                                              ON cug.group_id = agp.group_id
                              WHERE agp.permission_id IS NOT NULL) x
                      ON x.user_id = cu.id
       WHERE cu.is_active = TRUE
       GROUP BY cu.id
       ORDER BY perms ASC;
它没有在子选择中获取计数,而是加入每个用户的权限ID。根据用户ID进行分组将得到不同的结果,因为联合已经删除了所有重复项,并且ID在core_用户中也是唯一的。我假设用户的非空权限ID计数,这就是我认为您想要的

如果列上没有NULL约束,则可以在内部查询中删除WHERE.permission\u id NOT NULL。这里的想法是,不管怎样,空值最终都不会被计算在内,因此我们希望尽早丢弃它们


未测试,因为未提供架构或示例数据。可能包含打字错误。

我在“where子句”中仍然得到未知列“core\u user.id”。我还需要使用DISTINCT.@P.Nick表结构+示例数据。另外,您不需要DISTINCT,因为UNION会删除重复项。我不太明白它是如何工作的,所以我将其发布在这里:@P.Nick我的意思是重新创建您的案例的脚本,例如创建表。。。并插入。。。。您只需在此处选择MySQL复制、粘贴和共享链接。它的工作方式与预期不符,请参阅此处了解更多信息:不,仍然没有。这很奇怪,lemme check.@P.Nick您能否从核心用户选择id,从核心用户组选择用户id,从核心用户权限选择用户id?再试一次,我已经更改了sql,猜猜你所说的预期结果是什么意思。