SQL-复杂的SELECT查询到UPDATE



此处为SQL noob。所以我有一张桌子,里面有很多产品。其中一些产品是服装,这意味着由于尺寸不同,我对一个产品有六个不同的SKU。我现在想将第一个产品变体设置为每个组的父项。产品ID,因此父ID都是UUID。我成功地编写了一个SELECT查询,该查询获取所有产品编号,找到所有组(通过切掉最后一对数字(,并分配所有相应的父(uu(ID和父产品编号(用于人类可读的比较(-它运行得非常好。但我不知道如何将这个相当复杂的SELECT转换为UPDATE。有人有想法吗?版本为MySQL 8

表1如下(去掉所有未使用的列(:

ID        |product_number      |parent_id
-------------------------------------------
[UUID]1-1 |123-456-01          | NULL
[UUID]1-2 |123-456-02          | NULL
[UUID]1-3 |123-456-03          | NULL
[UUID]1-4 |123-456-04          | NULL
[UUID]2-1 |987-65-43-21-01     | NULL
[UUID]2-2 |987-65-43-21-02     | NULL
[UUID]2-3 |987-65-43-21-03     | NULL
[UUID]2-4 |987-65-43-21-04     | NULL

我的SELECT查询:

SELECT ArticleNumber, ArticleGroup, ParentID, t3.id as ID
FROM (
SELECT t2.product_number as ArticleNumber, GroupTable.GroupNr as ArticleGroup, GroupTable.product_number as ParentID
FROM (
SELECT MIN(result.product_number) as product_number, result.GroupNr
FROM (
SELECT product_number, 
SUBSTRING_INDEX(product_number, "-", (LENGTH(product_number) - LENGTH(REPLACE(product_number, "-", "")))) as GroupNr
FROM table1.product
) result
WHERE LENGTH(result.GroupNr) > 0
GROUP BY result.GroupNr
ORDER BY GroupNr
) as GroupTable
JOIN table1.product as t2
ON t2.product_number like concat(GroupTable.GroupNr, '%') AND t2.product_number != GroupTable.product_number
ORDER BY GroupTable.GroupNr 
) as Energija
JOIN table1.product as t3
ON t3.product_number = Energija.ParentID

我想更新parent_id,使Table1看起来像这样:

ID        |product_number      |parent_id
-------------------------------------------
[UUID]1-1 |123-456-01          | NULL
[UUID]1-2 |123-456-02          | [UUID]1-2
[UUID]1-3 |123-456-03          | [UUID]1-2
[UUID]1-4 |123-456-04          | [UUID]1-2
[UUID]2-1 |987-65-43-21-01     | NULL
[UUID]2-2 |987-65-43-21-02     | [UUID]2-2
[UUID]2-3 |987-65-43-21-03     | [UUID]2-2
[UUID]2-4 |987-65-43-21-04     | [UUID]2-2

它在SELECT查询中起作用,我只是不知道如何从中生成UPDATE。

UUID切换为字符串的示例表:

CREATE TABLE table1.product (
id varchar(255),
product_number varchar(255),
parent_id varchar(255));
INSERT INTO Table1.product (
id, product_number, parent_id)
VALUES(
'1-1',
'123-456-01',
NULL),
(
'1-2',
'123-456-02',
NULL),
(
'1-3',
'123-456-03',
NULL),
(
'1-4',
'123-456-04',
NULL),
(
'2-1',
'987-65-43-21-01',
NULL),
(
'2-2',
'987-65-43-21-02',
NULL),
(
'2-3',
'987-65-43-21-03',
NULL),
(
'2-4',
'987-65-43-21-04',
NULL);

您只需要稍微调整一下查询,并在update语句中设置parentUuid,其中产品uuid匹配。

在下面的示例代码中,我调整了您的查询,以获得产品uuid和父uuid之间的映射。然后,我更新了product表中设置parent_id的表,其中products uuid与查询中的product uuid匹配。

UPDATE table1.product p
SET parent_id = (
SELECT parentUUID
FROM (SELECT t3.id as parentUUID, Energija.productuuid as productUuid
FROM (
SELECT t2.id                     as productuuid,
t2.product_number         as ArticleNumber,
GroupTable.GroupNr        as ArticleGroup,
GroupTable.product_number as ParentID
FROM (
SELECT MIN(result.product_number) as product_number, result.GroupNr
FROM (
SELECT product_number,
SUBSTRING_INDEX(product_number, "-",
(LENGTH(product_number) - LENGTH(REPLACE(product_number, "-", "")))) as GroupNr
FROM table1.product
) result
WHERE LENGTH(result.GroupNr) > 0
GROUP BY result.GroupNr
ORDER BY GroupNr
) as GroupTable
JOIN table1.product as t2
ON t2.product_number like concat(GroupTable.GroupNr, '%') AND
t2.product_number != GroupTable.product_number
ORDER BY GroupTable.GroupNr
) as Energija
JOIN table1.product as t3
ON t3.product_number = Energija.ParentID) parentMapping
where parentMapping.productuuid = p.id);

最新更新