MySQL:获取具有相同数据的多行以跨列访问

MySQL:获取具有相同数据的多行以跨列访问,mysql,Mysql,我试图制作一个表格,列出每个客户的所有不同雇主和员工分配。但它们从我们的数据库中填充的方式是每个客户端重复行,因此看起来如下所示: id name staff employer 1 Joe Seinfeld, Jerry Body Shop 1 Joe Seinfeld, Jerry Party Inc. 2 Puddy Seinfeld, Jerry Body Shop 3 Newman Costanza, George

我试图制作一个表格,列出每个客户的所有不同雇主和员工分配。但它们从我们的数据库中填充的方式是每个客户端重复行,因此看起来如下所示:

id  name    staff            employer
1   Joe     Seinfeld, Jerry  Body Shop
1   Joe     Seinfeld, Jerry  Party Inc.
2   Puddy   Seinfeld, Jerry  Body Shop
3   Newman  Costanza, George Computers Inc.
3   Newman  Benes, Elaine    Postal Service
4   Delores Seinfeld, Jerry  Mulva LLC
5   Morty   Kramer, Cosmo    Executive Raincoats
从第1列中的多个ID可以看出,Joe在两个地方工作(Body Shop和Party Inc.),因此他有两行。然而,我想运行一个MySQL查询,让Joe(以及任何其他多个工作人员)在一行中列出所有内容。比如:

id  name    staff1           employer1           staff2          employer2
1   Joe     Seinfeld, Jerry  Body Shop           Seinfeld, Jerry Party Inc.
2   Puddy   Seinfeld, Jerry  Body Shop      
3   Newman  Costanza, George Computers Inc.      Benes, Elaine   Postal Service
4   Delores Seinfeld, Jerry  Mulva LLC      
5   Morty   Kramer, Cosmo    Executive Raincoats
或者,以任何方式显示所有数据都是最简单的,但要删除所有重复的ID并将其显示在附加到该ID的附加列中。此外,每个雇主都被分配给一名员工——没有两名员工拥有相同的雇主(即使数据库没有将其导出为单独的表)


希望这有意义!我还制作了一个包含更多示例的表(以及另一个将员工姓名与他们的电子邮件相匹配的表,这是查询的另一个[不太重要的]部分)。

您可以使用变量模拟带有
分区依据
子句的
行编号
窗口函数,该子句在MySQL中不可用:

SELECT ID, name,
       MAX(CASE WHEN rn = 1 THEN employer END) AS employer1,
       MAX(CASE WHEN rn = 1 THEN staff END) AS staff1,
       MAX(CASE WHEN rn = 2 THEN employer END) AS employer2,
       MAX(CASE WHEN rn = 2 THEN staff END) AS staff2
FROM (     
  SELECT ID, name, employer, staff, email,
         @rn := IF(@id = t1.ID, @rn + 1,
                  IF(@id := t1.ID, 1, 1)) AS rn
  FROM (
    SELECT t1.ID, t1.name, t1.employer, t1.staff, t2.email
    FROM table1 t1
    JOIN table2 t2 ON t1.staff = t2.staff) AS t1
  CROSS JOIN (SELECT @rn := 0, @id := 0) AS vars
  ORDER BY ID) AS t2
GROUP BY ID, name  
变量
@rn
枚举每个
ID
分区内的记录。使用
@rn
我们可以应用条件聚合,以便透视原始表的
雇主
员工
电子邮件
等字段

注意:上述查询处理每个
ID
的最大
2
记录数。它可以很容易地扩展以容纳更多的
ID
分区


鉴于您的评论,3是最大值,您可以使用
条件聚合
透视
您的结果。您还需要为每个组定义一个
行数

下面是一个例子:

select id, name, 
    max(case when rn = 1 then staff end) as staff1,
    max(case when rn = 1 then employer end) as employer1,
    max(case when rn = 2 then staff end) as staff2,
    max(case when rn = 2 then employer end) as employer2,
    max(case when rn = 3 then staff end) as staff3,
    max(case when rn = 3 then employer end) as employer3
from (
    select *, @rn:=if(@previd=id,@rn+1,1) rn, @previd:=id
    from yourtable, (select @rn:=1, @previd:=0) t
    order by id
    ) t
group by id, name

是否可以有两个以上的雇主?如果没有,您可以使用条件聚合来透视结果。如果您不知道最大值,则需要使用
动态sql
@sgedes。很少有人有三个雇主,这就是最大值。