我需要将具有相同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之外的任何其他标识符。
请注意,图像名称都是唯一的,名称没有特定的图案。
非常感谢你的帮助。
答案 0 :(得分:-2)
使用此处提供的相同想法:
MySQL pivot row into dynamic number of columns
以下是一种方法,它将生成一个填充了insert语句的列。可以执行这些语句来创建所需的表。一些警告......
如果要以编程方式执行此操作,则需要将其放入存储过程中,该存储过程将在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