I'm trying to make an sql request that turned out surprisingly difficult to me (or maybe this is just the end of the day, sigh).
I have 3 tables:
Team:
id |
---|
1 |
2 |
3 |
Team member table:
id | team_id |
---|---|
1 | 1 |
2 | 1 |
3 | 1 |
4 | 1 |
5 | 2 |
6 | 2 |
7 | 2 |
8 | 2 |
9 | 3 |
10 | 3 |
11 | 3 |
12 | 3 |
Team member info table:
id | team_member_id | department_id |
---|---|---|
1 | 1 | 12 |
3 | 2 | 43 |
5 | 3 | 23 |
7 | 4 | 12 |
9 | 5 | 12 |
11 | 6 | 12 |
13 | 7 | 12 |
15 | 8 | 12 |
17 | 9 | 43 |
19 | 10 | 23 |
21 | 11 | 14 |
23 | 12 | 23 |
These tables are simplified, so don't pay much attention to its structure.
What I need to do is to find id
s of teams which consists of members that belong to SINGLE department_id
and this department id should be a parameter.
So in our example I need to find teams, which members belong to department 12.
This is team(id=2) since it consists of members id=5,6,7,8 and all of them belong to department 12. Team 1 and Team 3 doesn't suit our needs since its members belong to multiple departments: (12, 43, 23) and (43, 23, 14) respectively.
Thanks a lot!
CodePudding user response:
this query selects the teams whose members belong all to department_id = 12 :
SELECT tm.team_id
FROM Team_member_info tmi
INNER JOIN Team_member tm
ON tm.id = tmi.team_member_id
GROUP BY tm.team_id
HAVING bool_and(tmi.department_id = 12)
see dbfiddle
CodePudding user response:
This could also be done with other aggregate functions max
and min
.
Select M.team_id
From Team_Member As M Inner Join Team_Member_Info As I On (M.id=I.team_member_id)
Group by M.team_id
Having Max(I.department_id)=Min(I.department_id)
And Max(I.department_id)=12;