Нелегко понять, что нужно, если есть только (недействительный) запрос и нет описания того, что он должен получить.Так что это всего лишь лучшее предположение:
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
во внутреннем запросе, если для столбцов нет нулевых ограничений. Идея здесь в том, что в конечном итоге нули не учитываются, поэтому мыхотите удалить их как можно раньше.)
(не проверено, поскольку не были предоставлены ни схема, ни примеры данных. Может содержать опечатки.)