Group_Concat sql 中的多列

Group_Concat multple columns in sql

我有两个 table。

第一个table叫Employee

  |EID|电子名|工资 |
=========================
  |1 |A |300 |
  |2 |B |400 |
  |3 |O |500 |

第二个table被称为Employee_Sal_Changes

  |EID| Salary_Change_History|年
=======================================
  |1 |100 |2012
  |1 |200 |2013
  |1 |300 |2014
  |2 |200 |2013
  |2 |400 |2014
  |3 |100 |2011
  |3 |200 |2012
  |3 |300 |2013
  |3 |500 |2014

在我的前端table,我想展示

 id |薪资变动历史|
=================================
 一个| 100:2012 |
      | 200:2013 |
      | 300:2014 |
=================================
 乙 | 200:2013 |
      | 400:2014 |
=================================
 欧 | 100:2011 |
      | 200:2012 |
      | 300:2013 |
      | 400:2014 |
=================================

我想将 salary_change_history 和年份匹配到 EID 并使用循环在前端显示它们。

为了得到这些,我尝试使用 group_concat 将它们存储在一个数组中,但它只获取 EID = 1

的值

这是后台的查询

Select 
(select Group_Concat(Employee_Sal_Changes.Salary_Change_History),(Group_Concat(Employee_Sal_Changes.year) from Employee_Sal_Changes left join Employee on Employee_Sal_Changes.EID = Employee.EID), 
Employee.EName
From Employee_Sal_Changes

有更好的方法还是继续使用group_concat?

您可以使用聚合:

select 
    eid, 
    group_concat(
        year, ':', salary_change_history 
        order by year
        separator '\n'
    ) salary_change_history
from employee_sal_changes
group by eid

对于每个员工,这会生成一个由 <year>:<salary> 个值组成的列表,这些值由回车符 returns 分隔。请注意,您不需要引入 employee table 来生成该结果集:另一个 table 具有所有必要的信息。

Demo on DB Fiddle:


如果您还需要员工姓名:

select 
    s.eid, 
    e.ename,
    group_concat(
        s.year, ':', s.salary_change_history 
        order by s.year
        separator '\n'
    ) salary_change_history
from employee_sal_changes s
inner join employee e on e.eid = s.eid
group by s.eid, e.ename