Не можете получить доступ к переменной во внутренней области видимости?

0

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

Любая идея, как это исправить?

Теги:

3 ответа

1
Лучший ответ

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

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, поскольку ни схема, ни выборочные данные не были предоставлены. Может содержать опечатки.)

0

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

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
    Он работает не совсем так, как ожидалось, смотрите здесь для дополнительной информации: pastebin.com/qbS8Vj2t
  • 0
    Можете ли вы попробовать еще раз, я просто обновил код.
Показать ещё 4 комментария
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.

  • 0
    Я все еще получаю Unknown column 'core_user.id' in 'where clause' . Мне также нужно использовать DISTINCT .
  • 2
    @ P.Nick dbfiddle.uk Структуры таблиц + Пример данных. Кроме того, вам не нужно DISTINCT потому что UNION удаляет дубликаты.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню