为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL动态枢轴

MySQL动态枢轴

呼唤远方 2019-12-06 09:58:39
我有一张这样的产品零件表:部分part_id      part_type      product_id--------------------------------------1            A              12            B              13            A              24            B              25            A              36            B              3我想要一个查询,将返回这样的表:product_id      part_A_id      part_B_id----------------------------------------1               1              22               3              43               5              6在其实际实施中,将有数百万个产品零件
查看完整描述

3 回答

?
桃花长相依

TA贡献1860条经验 获得超8个赞

不幸的是,MySQL没有PIVOT函数,但是您可以使用聚合函数和CASE语句对其进行建模。对于动态版本,您将需要使用准备好的语句:


SET @sql = NULL;

SELECT

  GROUP_CONCAT(DISTINCT

    CONCAT(

      'max(case when part_type = ''',

      part_type,

      ''' then part_id end) AS part_',

      part_type, '_id'

    )

  ) INTO @sql

FROM

  parts;

SET @sql = CONCAT('SELECT product_id, ', @sql, ' 

                  FROM parts 

                   GROUP BY product_id');


PREPARE stmt FROM @sql;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

请参见带有演示的SQL Fiddle


如果只有几列,则可以使用静态版本:


select product_id,

  max(case when part_type ='A' then part_id end) as Part_A_Id,

  max(case when part_type ='B' then part_id end) as Part_B_Id

from parts

group by product_id


查看完整回答
反对 回复 2019-12-06
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

SQL Server有一个PIVOT关键字,但是对于MySQL,您将需要使用很多CASE / IF语句或很多JOIN。


这是有关如何执行此操作的先前文章。


查看完整回答
反对 回复 2019-12-06
?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

只需引用两次-(您在这里实际上没有太多问题)


select a.product_id, a.part_id "part_a_id", b.part_id "part_b_id"

from parts a, parts b

where a.product_id = b.product_id


查看完整回答
反对 回复 2019-12-06
  • 3 回答
  • 0 关注
  • 557 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信