SQL查询以获取重复行的结果

3

我是一名新手,对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

管理级别

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      

正如您所看到的,它没有显示亚当的第二个经理。


这个链接可能会有所帮助:https://dev59.com/BY3da4cB1Zd3GeqP4MPy - Ab Bennett
3个回答

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


@StanislavL 我曾经考虑过这个问题,但后来发现不是这样的情况。 - Radim Bača

1

不清楚managing_level表中的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

SQLFiddle演示


很好的解决方案,没有使用CASE - Radim Bača

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       

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接