Я пытаюсь заставить этот кусок SQL-запроса работать. Проблема в том, что я не могу получить доступ к core_user.id
в 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
Если я попробую target.id
с core_user AS target
он тоже не работает: Unknown column 'target.id' in 'where clause'
Ожидаемые результаты:
+----------------------------------+-------+
| id | perms |
+----------------------------------+-------+
| ab7ec54bf9124dffb807fb89f9ea8036 | 0 |
| b54d4d3f97134dfcbc36ac193c0c1250 | 81 |
| c69ffa4d162b49129ff6a316da3caaa3 | 64 |
| f8ac73eee80044359c246f3b173aa631 | 0 |
+----------------------------------+-------+
Любая идея, как это исправить?
Нелегко понять, чего хочет, если есть только (недопустимый) запрос и нет описания того, что он должен получить. Так что это просто лучшее предположение:
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
также уникален в core_user
(я предполагаю)) подсчет недействительных идентификаторов пользователя, что, как я считаю, вам нужно.
(Вы можете удалить WHERE <alias>.permission_id IS NOT NULL
во внутреннем запросе, если в столбцах нет нулевых ограничений. Идея здесь в том, что в любом случае нулевые значения не учитываются, поэтому мы хотим отменить их как можно раньше.)
(Untested, поскольку ни схема, ни выборочные данные не были предоставлены. Может содержать опечатки.)
Ну, надеюсь, я смогу получить ожидаемый результат, исключив групповые предпосылки:
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 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.
Unknown column 'core_user.id' in 'where clause'
. Мне также нужно использовать DISTINCT
.
DISTINCT
потому что UNION
удаляет дубликаты.