Не можете получить доступ к переменной во внутренней области видимости? - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь заставить этот кусок 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

Если я попробую target.id с core_user AS target, это тоже не сработает: Unknown column 'target.id' in 'where clause'

Ожидаемые результаты:

+----------------------------------+-------+
| id                               | perms |
+----------------------------------+-------+
| ab7ec54bf9124dffb807fb89f9ea8036 |    0 |
| b54d4d3f97134dfcbc36ac193c0c1250 |    81 |
| c69ffa4d162b49129ff6a316da3caaa3 |    64 |
| f8ac73eee80044359c246f3b173aa631 |    0 |
+----------------------------------+-------+

Есть идеи, как это исправить?

Ответы [ 3 ]

0 голосов
/ 24 июня 2018

Ну, я надеюсь, что смогу получить ожидаемый результат, исключив групповых премиссонов:

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
0 голосов
/ 24 июня 2018

Нелегко понять, что нужно, если есть только (недействительный) запрос и нет описания того, что он должен получить.Так что это всего лишь лучшее предположение:

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

(не проверено, поскольку не были предоставлены ни схема, ни примеры данных. Может содержать опечатки.)

0 голосов
/ 24 июня 2018

Я бы переписал это как:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...