MySQL возвращает столбец, если имя пользователя является частью отключенной группы - PullRequest
0 голосов
/ 12 января 2019

У меня есть две таблицы, как показано ниже

radcheck

+----+-------------------+--------------------+----+--------+
| id | username          | attribute          | op | value  |
+----+-------------------+--------------------+----+--------+
|  1 | userA             | Cleartext-Password | := | Apass  |
|  2 | userB             | Cleartext-Password | := | Bpass  |
|  3 | DC:9F:DB:xx:xx:xx | Auth-Type          | := | Accept |
|  4 | userC             | Cleartext-Password | := | Cpass  |
+----+-------------------+--------------------+----+--------+

radusergroup

+----------+------------+----------+
| username | groupname  | priority |
+----------+------------+----------+
| userA    | daily-plan |        1 |
| userA    | disabled   |        0 |
| userB    | quota-plan |        1 |
| userC    | disabled   |        0 |
| userC    | try        |        1 |
+----------+------------+----------+

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

SELECT c.id, c.username, c.value, g.groupname
FROM radcheck c LEFT JOIN
     radusergroup g
     USING (username)
WHERE attribute = 'Cleartext-Password' AND
      groupname <> 'disabled';

Я попробовал несколько способов, используя тройные левые объединения, используя запрос ниже, но они не работают, столбец имени группы в результате всегда имеет первое имя группы, найденное в таблице radusergroup:

SELECT c.id, c.username, c.value, g.groupname, (disabled.username IS NOT NULL) AS disabled
FROM radcheck c LEFT JOIN
     radusergroup g
     ON c.username = g.username LEFT JOIN
     radusergroup disabled
     ON disabled.username = c.username AND
        disabled.groupname = 'disabled'
WHERE (c.username = g.username) AND
      attribute = 'Cleartext-Password'
GROUP BY c.username;

вышеуказанные выходы:

+----+----------+-------+------------+----------+
| id | username | value | groupname  | disabled |
+----+----------+-------+------------+----------+
|  1 | userA    | Apass | daily-plan |        1 |
|  2 | userB    | Bpass | quota-plan |        0 |
|  4 | userC    | Cpass | disabled   |        1 |
+----+----------+-------+------------+----------+

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вы можете попробовать CASE STATEMENT в SQL Query. Как ниже:

SELECT c.id, c.username, c.value, g.groupname, (CASE
    WHEN g.groupname = 'disabled' THEN 1
    ELSE 0
END) AS 'disabled' FROM radcheck c LEFT JOIN radusergroup g USING (username) WHERE attribute = 'Cleartext-Password';
0 голосов
/ 12 января 2019

Самое простое решение - расширить ваш запрос с помощью EXISTS и коррелированного подзапроса.

SELECT c.id,
       c.username,
       c.value,
       g.groupname,
       EXISTS (SELECT *
                      FROM radusergroup g2
                           WHERE g2.username = c.username
                                 AND g2.groupname = 'disabled') disabled
       FROM radcheck c
            LEFT JOIN radusergroup g
                      ON g.username = c.username
       WHERE c.attribute = 'Cleartext-Password'
             AND g.groupname <> 'disabled';

Это предполагает, что ваш первый запрос в порядке. Я не могу сказать из вашего поста, все ли в порядке, так как он будет возвращать строку для каждой не отключенной группы, в которой находится пользователь, то есть, вероятно, более одной строки на пользователя. Если это тоже проблема, вы можете использовать второй EXISTS аналогичным образом с g2.groupname <> 'disabled' и удалить левое соединение.


Редактировать: Если вы хотите, чтобы флаги были только у пользователя в отключенной и / или не отключенной группе:

SELECT c.id,
       c.username,
       c.value,
       EXISTS (SELECT *
                      FROM radusergroup g2
                           WHERE g2.username = c.username
                                 AND g2.groupname = 'disabled') disabled,
       EXISTS (SELECT *
                      FROM radusergroup g2
                           WHERE g2.username = c.username
                                 AND g2.groupname <> 'disabled') not_disabled
       FROM radcheck c
       WHERE c.attribute = 'Cleartext-Password';
...