使用MySQL中管道分隔列值存在时计算最大值

时间:2016-09-17 13:34:36

标签: mysql sql

表格下面的译员

Emp Table 员工可以属于以下形式的多个部门

emp departments
E1   D1|D2|D3
E2   D2
E3   D1|D3

部门表

departments    Manager
D1              M1
D2              M2

我们如何找到拥有最多员工的经理?

2 个答案:

答案 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子句来解决。