表格下面的译员
Emp Table 员工可以属于以下形式的多个部门
emp departments
E1 D1|D2|D3
E2 D2
E3 D1|D3
部门表
departments Manager
D1 M1
D2 M2
我们如何找到拥有最多员工的经理?
答案 0 :(得分:3)
首先,如果可以,您应该更改数据的结构 employees表应该在每一行包含一个emp-department关系,多个员工应该有几行。
如果您坚持使用当前结构,可以使用join
获取包含经理和员工之间映射的表格:
select D.manager, E.emp from departments as D inner join employees as E on
E.departments like CONCAT( '%|' , D.department, '|%');
在此表中,您可以使用count来获取每位经理的员工数量:
select manager, count(*) from (
select D.manager, E.emp from departments as D inner join employees as E on
E.departments like CONCAT( '%|' , D.department, '|%')
) as X group by X.emp;
答案 1 :(得分:1)
其他人实际上已经建议您的数据结构需要规范化。如果你在他们所属的员工和部门之间有一个联结表,那么你甚至不需要问这个问题,因为这是微不足道的。
但是,如果您现在仍然坚持使用现有技术,那么使用FIND_IN_SET()
函数和LEFT JOIN
表达式的解决方案,我们将|
更改为,
REPLACE()
用于连接条件函数参数的正确分隔符:
select d.manager, count(*) AS employees_cnt
from departments d
left join employees e on find_in_set(d.departments, replace(e.departments,'|',',')) > 0
group by d.manager
order by employees_cnt desc
结果:
manager employees_cnt
M1 2
M2 2
如果您只需要一个,那么您可以在查询结尾处添加LIMIT 1
子句,但请记住,关系将通过order by子句来解决。