我是sql查询的新手,我有一个问题。以下是详细信息:
我有两张桌子:
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
我想获取所有用户名及其经理
预期结果:
username manager1 manager2
-------------------------------
adam david danny
siva danny
muthu david
这是我使用的查询:
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;
结果:
username manager1 manager2
-------------------------------
adam david
siva danny
muthu david
正如您所看到的,它没有显示adam的第二位经理。
答案 0 :(得分:1)
使用条件聚合。
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
还有一个细节:请勿使用FROM
后面的逗号。它被认为是一个坏习惯。请改用JOIN
。
答案 1 :(得分:1)
目前尚不清楚level
表中的managing_level
字段是什么,但这里是获得预期结果的查询:
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
答案 2 :(得分:1)
如果等级表示经理的“号码”,请尝试:
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