Reputation: 95
I am really new in sql query and i have 1 question. Below are the details:
I have two tables:
user_table
user_id username level
-------------------------
1 adam 0
2 david 1
3 danny 2
4 siva 0
5 muthu 0
6 chong 0
managing_level
staff manager level
---------------------
1 2 1
1 3 2
4 3 2
5 2 2
I want to get all the username and their managers
expected result:
username manager1 manager2
-------------------------------
adam david danny
siva danny
muthu david
This is the query that I used:
select u.username as username,
(select username from user where user_id=m.manager and level=1) as manager1,
(select username from user where user_id=m.manager and level=2) as manager2
from user u, managing_level manager
where u.user_id=m.staff;
result:
username manager1 manager2
-------------------------------
adam david
siva danny
muthu david
As you can see, it doesn't show the second manager for adam.
Upvotes: 3
Views: 89
Reputation: 320
If level means the "number" of manager, try this:
SELECT u.username, m1.username AS manager1, m2.username AS manager2
FROM user_table u LEFT JOIN (SELECT m.staff, m.manager, m.level, s1u.username
FROM managing_level m INNER JOIN user_table s1u ON m.manager = s1u.user_id
WHERE m.level = 1
) m1 ON u.user_id = m1.staff
LEFT JOIN (SELECT m.staff, m.manager, m.level, s2u.username
FROM managing_level m INNER JOIN user_table s2u ON m.manager = s2u.user_id
WHERE m.level = 2
) m2 ON u.user_id = m2.staff
WHERE m1.staff IS NOT NULL OR m2.staff IS NOT NULL
Upvotes: 1
Reputation: 10711
Use conditional aggregation.
select usr.username as username,
max(case when man.level=1 then man.username end) as manager1,
max(case when man.level=2 then man.username end) as manager2
from user_table usr
join managing_level m on m.staff = usr.user_id
join user_table man on m.manager = man.user_id
group by usr.user_id, usr.username
One more detail: do not use the commas behind FROM
. It considered to be a bad habit. Use JOIN
instead.
Upvotes: 1
Reputation: 24144
It's not clear what is level
field in the managing_level
table for but here is the query to get expected results:
select MAX(u0.username) as username,
MAX(u1.username) as manager1,
MAX(u2.username) as manager2
from managing_level m
LEFT JOIN user_table u0 ON m.staff=u0.user_id
LEFT JOIN user_table u1 ON (m.manager=u1.user_id) AND (u1.level=1)
LEFT JOIN user_table u2 ON (m.manager=u2.user_id) AND (u2.level=2)
GROUP BY m.staff
Upvotes: 1