MySQL: захватывает только пользователей, у которых есть только одна строка? - PullRequest
0 голосов
/ 21 января 2012

Это то, что у меня есть:

SELECT users.*
            FROM users INNER JOIN roles_users ON users.id = roles_users.user_id 
            WHERE roles_users.role_id IN (1)
            GROUP BY users.id
            HAVING COUNT(*) = 1

Я хотел бы получить всех пользователей, которые ТОЛЬКО имеют одну строку, с role_id 1.

Приведенный выше запрос собирает всех пользователей, у которых есть строка с role_id 1, поэтому он также показывает тех, у кого больше строк с ролью role_id 2, например role_id 3.

Так, как я могу сделать ГДЕ role_users.role_id В (1), а НЕ в 2,3,4 .. что-то?

Ответы [ 3 ]

1 голос
/ 21 января 2012

Добавить анти-объединение, чтобы исключить тех пользователей, у которых также есть другие роли

SELECT users.*
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id 
-- replace by IN (1, 4) if needed
WHERE roles_users.role_id IN (1)
AND NOT EXISTS (SELECT 1 FROM roles_users
                 WHERE roles_users.user_id = users.id
                    -- replace by NOT IN (1, 4) if needed
                   AND roles_users.role_id NOT IN (1))
GROUP BY users.id
HAVING COUNT(*) = 1

Выше, как обычно, вполне зависит от MySQL, вы не должны выбирать столбцы, которые не являются частью предложения GROUP BY. Кроме того, возможно, это не самая лучшая производительность, так как roles_users соединяется два раза с users. Я не знаю, может ли MySQL оптимизировать это.

0 голосов
/ 21 января 2012

Примерно так должно получиться:

SELECT users.*
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id 
WHERE roles_users.role_id = 1
and 1 = (select count(*)
         from roles_users
         where users.id = roles_users.user_id)
GROUP BY users.id;
0 голосов
/ 21 января 2012

Попробуйте это (не проверено):

SELECT users.*, COUNT(*) AS roleX_count
FROM users
INNER JOIN roles_users ON users.id = roles_users.user_id 
GROUP BY users.id, roles_users.role_id
HAVING roleX_count = 1 AND roles_users.role_id = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...