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。很少有人有三个雇主,这就是最大值。