在MySQL中将具有相同标识符的数据从行移动到列


Move data with the same identifiers from rows to columns in MySQL

我需要将具有相同product_id的数据从行移动到列。示例:

From: table (product_image)
product_id    image  
----------    -----
12655         abc4.gif
12655         7hgd.gif
12655         8jd.gif
12656         23n.gif
12656         ej6.gif
12656         99j.gif
and so on
To: Table (sorted_image)
product _id    image_1    image_2    image_3
-----------    -------    -------    -------
12655          abc4.gif   7hgd.gif   8jd.gif
12656          23n.gif    ej6.gif    99j.gif
and so on

我有超过40000行的数据,所以我无法手动逐个寻址products_id。此外,对于某些产品可能只有1个图像,而对于其他一些产品可能多达7个图像。源表(product_image.image)除了product_id之外没有任何其他标识符。

请注意,图像名称都是唯一的,名称没有特定的模式。

非常感谢你的帮助。

使用此处提供的相同想法:

MySQL将行数据透视为动态列数

以下是一种方法,它将生成一个用insert语句填充的列。可以执行这些语句来创建所需的表。有几个注意事项。。。

  1. 它假设有一定数量的列(7)
  2. 如果您想以编程方式执行此操作,则需要将其放入一个存储过程中,该存储过程将执行for循环或其他类似构造中的每个insert语句

    如果存在product_pivot,则丢弃表;

    如果存在product_test,则删除表;

    CREATE TABLE product_pivot(product_ id INT,图像1 VARCHAR(50),图像2 VARCHAR(50),图像3 VARCHAR(50),图像4 VARCHAR(50),图像5 VARCHAR(50),图像6 VARCHAR(50),图7 VARCHAR(50));

    CREATE TABLE product_test(product_id INT,图像VARCHAR(50));

    插入产品测试值(12655,'abc4.gif');

    插入产品测试值(12655,'7hgd.gif');

    插入产品测试值(12655,'8jd.gif');

    插入产品测试值(12656,'ej6.gif');

    插入产品测试值(12656,'99j.gif');

    插入产品测试值(12656,'23n.gif');

    插入产品测试值(12657,'23a.gif');

    选择CONCAT('INSERT INTO product_pivot',c.col,'值',v.dta)来自(选择product_id,GROUP_CONCT(col)col来自(选择p.product_id,CONCAT('(product_id',',',GROUP_CONCAT(DISTINCT CONCAT('image_',@sql:=@sql+1)),')')col(选择@sql:=0)r来自产品_测试p分组依据p.product_id)x按产品分组_id)c联接(选择product_id,GROUP_CONCT(dta)dta来自(选择p.product_id,CONCAT('(',p.product_id,',',GROUP_CONCAT(DISTINCT CONCAT(",p.image,"),")")dta来自产品_测试p分组依据p.product_id)x按产品分组_id)vON c.product_id=v.product_id;