3 votes

Sélectionner seulement si un rôle d'utilisateur dans SQL

SELECT user_id FROM user_accounts 
INNER JOIN roles_users
ON (user_accounts.user_id = roles_users.user_id)
WHERE roles_users.role_id IN (1)

C'est ce que j'ai essayé.

Ce que je souhaite est de sélectionner tous les utilisateurs user_id, qui sont seulement un utilisateur (role_id 1). Dans mon application tout le monde a le role_id 1, et ensuite ils ont une nouvelle ligne avec leur user_id et role_id avec soit 2,3,4 si ils sont un partenaire, admin, etc.

Alors comment puis-je sélectionner tous les utilisateurs user_id qui ont SEULEMENT 1 ligne dans roles_users, avec le role_id 1 ?

MySQL

2voto

Marc B Points 195501
SELECT user_accounts.user_id, COUNT(roles_users.user_id) AS cnt
FROM user_accounts
INNER JOIN roles_users ON (user_accounts.user_id = roles_uers.user_id)
GROUP BY user_id
HAVING (cnt = 1)

0voto

Oded Points 271275

Vous pouvez utiliser GROUP BY avec un HAVING qui limite les résultats à une seule ligne :

SELECT user_accounts.user_id FROM user_accounts 
INNER JOIN roles_users
ON (user_accounts.user_id = roles_users.user_id)
WHERE roles_users.role_id = 1
GROUP BY user_accounts.user_id
HAVING COUNT(user_accounts.user_id) = 1

0voto

Code Magician Points 8724

Que diriez-vous de quelque chose comme ceci

SELECT user_id 
FROM roles_users
GROUP BY user_id 
HAVING COUNT(*) = 1 and MIN(role_id) = 1

Vous pourriez aussi l'écrire comme ceci :

SELECT user_id 
FROM roles_users RU
WHERE role_id = 1 
AND NOT EXISTS(SELECT * FROM roles_users WHERE role_id <> 1 and user_id = RU.user_id)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X