用于从重复行获取结果的SQL查询

时间:2017-11-09 06:58:18

标签: mysql sql

我是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的第二位经理。

3 个答案:

答案 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

demo

还有一个细节:请勿使用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

SQLFiddle demo

答案 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       
相关问题