Mysql 无法访问内部作用域中的变量?
我正在尝试让这段SQL查询正常工作。问题是我无法访问其参数中的内容中的core_user.id。我真的不知道为什么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 (
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,猜猜你所说的预期结果是什么意思。