Suponha que tenha a seguinte configuração de banco de dados:
Users (
id int primary key,
name varchar(255)
)
OrgUnits (
id int primary key,
name varchar(255)
)
Users_OrgUnits (
user_id int,
orgunit_id int,
primary key (user_id, orgunit_id)
)
Você pode encontrar facilmente todos os usuários pertencentes a uma determinada UO com uma consulta como
SELECT U.*
FROM Users U
JOIN Users_OrgUnits UOU ON (
U.user_id = UOU.user_id
AND UOU.orgunit_id = X
)
Existe uma maneira, com uma única consulta , de solicitar ao banco de dados todos os usuários pertencentes a duas ou mais UOs ao mesmo tempo ?
Se você fizer algo como
SELECT U.*
FROM Users U
JOIN Users_OrgUnits UOU ON (
U.user_id = UOU.user_id
AND UOU.orgunit_id IN (X, Y)
)
Você obteria usuários pertencentes a pelo menos uma dessas UOs, não necessariamente a ambas.
EXEMPLO:
Usuários
Eu iria | nome |
---|---|
1 | administrador |
2 | usuário1 |
3 | usuário2 |
4 | usuário3 |
Unidades organizacionais
Eu iria | nome |
---|---|
1 | Administração |
2 | RH |
3 | Folha de pagamento |
4 | Saúde e Segurança |
Users_OrgUnits
ID do usuário | orgnit_id |
---|---|
1 | 1 |
2 | 2 |
2 | 3 |
3 | 3 |
3 | 4 |
4 | 2 |
4 | 3 |
4 | 4 |
Agora, gostaria de pedir para todos os usuários pertencentes tanto a "Folha de Pagamento" quanto a "Saúde e Segurança", ou seja, UOs com ID 3 e 4, e obter este resultado:
Eu iria | nome |
---|---|
3 | usuário2 |
4 | usuário3 |
Isso pode ser feito por uma simples cláusula de contagem:
ou escrito de forma diferente usando o id
https://dbfiddle.uk/?rdbms=mariadb_10.5&fiddle=e1d7a2db24595a21c3b18f08f7f0adb6
having count(distinct orgunit_id) >1;
retornará apenas os valores repetidos mais de uma vez 2,3,... para cadauser_id
naUsers_OrgUnits
tabela