将具有相同标识符的数据从行移动到 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
我有超过 40,000 行数据,所以我无法手动地逐一处理 products_ids。此外,对于某些人来说它可能只有 1 张图像,而对于其他 product_ids 可能最多有 7 张图像。来源 table (product_image.image) 除了 product_id.
没有任何其他标识符
请注意,图片名称都是唯一的,没有特定的名称模式。
非常感谢您的帮助。
使用此处提出的相同想法:
MySQL pivot row into dynamic number of columns
以下方法将生成一个填充有插入语句的列。可以执行这些语句来创建所需的 table。一些注意事项...
- 假设有一定数量的列 (7)
如果您想以编程方式执行此操作,则需要将其放入存储过程中,该存储过程将在 for 循环或其他类似结构中执行每个插入语句
删除 TABLE 如果存在 product_pivot
;
删除 TABLE 如果存在 product_test
;
创建 TABLE product_pivot (
product_id 情报,
image1 VARCHAR(50),
image2 VARCHAR(50),
image3 VARCHAR(50),
image4 VARCHAR(50),
image5 VARCHAR(50),
image6 VARCHAR(50),
image7 VARCHAR(50)
)
;
创建 TABLE product_test(product_id INT,图像 VARCHAR(50))
;
插入 product_test 值(12655,'abc4.gif')
;
插入 product_test 值(12655,'7hgd.gif')
;
插入 product_test 值(12655,'8jd.gif')
;
插入 product_test 值(12656,'ej6.gif')
;
插入 product_test 值(12656,'99j.gif')
;
插入 product_test 值(12656,'23n.gif')
;
插入 product_test 值(12657,'23a.gif')
;
SELECT
CONCAT('INSERT INTO product_pivot ',
c.col,
'价值观',
v.dta)
从
(
SELECT
product_id
, GROUP_CONCAT(col) col
从
(
SELECT
p.product_id
, CONCAT('(product_id', ',',
GROUP_CONCAT(不同的连接('image_', @sql := @sql + 1)),
')') 列
, (
SELECT
@sql := 0) r
从
product_testp
分组 p.product_id) x
分组 product_id) c
加入
(
SELECT
product_id
, GROUP_CONCAT(dta) dta
从
(
SELECT
p.product_id
, CONCAT('(', p.product_id, ',',
GROUP_CONCAT(DISTINCT CONCAT('"', p.image, '"')), ')') dta
从
product_testp
分组 p.product_id) x
分组 product_id) v
ON c.product_id = v.product_id
;
我需要将具有相同 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 行数据,所以我无法手动地逐一处理 products_ids。此外,对于某些人来说它可能只有 1 张图像,而对于其他 product_ids 可能最多有 7 张图像。来源 table (product_image.image) 除了 product_id.
没有任何其他标识符请注意,图片名称都是唯一的,没有特定的名称模式。
非常感谢您的帮助。
使用此处提出的相同想法:
MySQL pivot row into dynamic number of columns
以下方法将生成一个填充有插入语句的列。可以执行这些语句来创建所需的 table。一些注意事项...
- 假设有一定数量的列 (7)
如果您想以编程方式执行此操作,则需要将其放入存储过程中,该存储过程将在 for 循环或其他类似结构中执行每个插入语句
删除 TABLE 如果存在 product_pivot ;
删除 TABLE 如果存在 product_test ;
创建 TABLE product_pivot ( product_id 情报, image1 VARCHAR(50), image2 VARCHAR(50), image3 VARCHAR(50), image4 VARCHAR(50), image5 VARCHAR(50), image6 VARCHAR(50), image7 VARCHAR(50) ) ;
创建 TABLE product_test(product_id INT,图像 VARCHAR(50)) ;
插入 product_test 值(12655,'abc4.gif') ;
插入 product_test 值(12655,'7hgd.gif') ;
插入 product_test 值(12655,'8jd.gif') ;
插入 product_test 值(12656,'ej6.gif') ;
插入 product_test 值(12656,'99j.gif') ;
插入 product_test 值(12656,'23n.gif') ;
插入 product_test 值(12657,'23a.gif') ;
SELECT CONCAT('INSERT INTO product_pivot ', c.col, '价值观', v.dta) 从 ( SELECT product_id , GROUP_CONCAT(col) col 从 ( SELECT p.product_id , CONCAT('(product_id', ',', GROUP_CONCAT(不同的连接('image_', @sql := @sql + 1)), ')') 列 , ( SELECT @sql := 0) r 从 product_testp 分组 p.product_id) x 分组 product_id) c 加入 ( SELECT product_id , GROUP_CONCAT(dta) dta 从 ( SELECT p.product_id , CONCAT('(', p.product_id, ',', GROUP_CONCAT(DISTINCT CONCAT('"', p.image, '"')), ')') dta 从 product_testp 分组 p.product_id) x 分组 product_id) v ON c.product_id = v.product_id ;