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