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

时间:2015-06-24 16:31:29

标签: php mysql sql opencart

我需要将具有相同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

我有超过40,000行数据,所以我无法手动和逐个地解决product_ids问题。对于某些人来说,它可能只有1个图像,对于其他一些product_ids,它可能最多有7个图像。源表(product_image.image)没有除product_id之外的任何其他标识符。

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

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:-2)

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

MySQL pivot row into dynamic number of columns

以下是一种方法,它将生成一个填充了insert语句的列。可以执行这些语句来创建所需的表。一些警告......

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

    DROP TABLE IF EXISTS product_pivot ;

    DROP TABLE IF EXISTS product_test ;

    CREATE TABLE product_pivot(   product_id INT,   image1 VARCHAR(50),   image2 VARCHAR(50),   image3 VARCHAR(50),   image4 VARCHAR(50),   image5 VARCHAR(50),   image6 VARCHAR(50),   image7 VARCHAR(50) ) ;

    CREATE TABLE product_test(product_id INT,image VARCHAR(50)) ;

    INSERT INTO product_test VALUES(12655,'abc4.gif') ;

    INSERT INTO product_test VALUES(12655,'7hgd.gif') ;

    INSERT INTO product_test VALUES(12655,'8jd.gif') ;

    INSERT INTO product_test VALUES(12656,'ej6.gif') ;

    INSERT INTO product_test VALUES(12656,'99j.gif') ;

    INSERT INTO product_test VALUES(12656,'23n.gif') ;

    INSERT INTO product_test VALUES(12657,'23a.gif') ;

    选择   CONCAT('INSERT INTO product_pivot',          c.col,          '价值',          v.dta) 从   (     选择       PRODUCT_ID       ,GROUP_CONCAT(col)col     从       (         选择           p.product_id           ,CONCAT('(product_id',',',                    GROUP_CONCAT(DISTINCT CONCAT('image_',@ sql:= @sql + 1)),                    ')')col           ,((               选择                 @sql:= 0)r         从           product_test p         GROUP BY p.product_id)x     GROUP BY product_id)c   加入   (     选择       PRODUCT_ID       ,GROUP_CONCAT(dta)dta     从       (         选择           p.product_id           ,CONCAT('(',p.product_id,',',                    GROUP_CONCAT(DISTINCT CONCAT(''',p.image,'“')),')')dta         从           product_test p         GROUP BY p.product_id)x     GROUP BY product_id)v     ON c.product_id = v.product_id