UPDATE 语句使用 GROUP_CONCAT()

问题描述 投票:0回答:2

我正在尝试创建一个查询来更新另一个表,其中 SUBQUERY/DERIVED-QUERY 使用两个函数,GROUP BY 和 GROUP_CONCAT()。

如果我使用一个中间临时表来存储“分组/连接”数据,然后将“重新组织”的数据推送到目标表,我就能得到我想要的输出。

我必须运行 2 个单独的查询——一个用字段中的“组织”数据填充临时表,然后另一个更新将“组织”数据从临时表推送到最终目标表。

我在使用

GROUP_CONCAT(CONCAT(quantity,''))
时使用隐式-显式转换。

CREATE TABLE `test_tbl` (
            `equipment_num` varchar(20),
            `item_id` varchar(40),
            `quantity` decimal(10,2),
            `po_num` varchar(20)
)

INSERT INTO `test_tbl`
(`equipment_num`, `item_id`, `quantity`, `po_num`) VALUES
(TRHU8399302, '70-8491', '5.00', 'PO10813-Air'),
(TRHU8399302, '40-21-72194', '22.00', '53841'),
(TRHU8399302, '741-PremBundle-CK', '130.00', 'NECTAR-PMBUNDLE-2022'),
(TRHU8399302, '741-GWPBundle-KG', '650.00', 'NECTAR2021MH185-Fort'),
(TRHU6669420, '01-DGCOOL250FJ', '76000.00', '4467'),
(TRHU6669420, '20-2649', '450.00', 'PO9994'),
(TRHU6669420, 'PFL-PC-GRY-KG', '80.00', '1020'),
(TRHU6669420, '844067025947', '120.00', 'Cmax 2 15 22'),
(TRHU5614145, 'Classic Lounge Chair Walnut leg- A XH301', '372.00', 'P295'),
(TRHU5614145, '40-21-72194', '22.00', '53837'),
(TRHU5614145, 'MAR-PLW-55K-BX', '2313.00', 'SF220914R-CA'),
(TRHU5614145, 'OPCP-BH1-L', '150.00', 'PO-00000429B'),
(TRHU5367889, 'NL1000WHT', '3240.00', 'PO1002050'),
(TRHU4692842, '1300828', '500.00', '4500342008'),
(TRHU4560701, 'TSFP-HB2-T', '630.00', 'PO-00000485A'),
(TRHU4319443, 'BGS21ASFD', '20.00', 'PO10456-1'),
(TRHU4317564, 'CSMN-AM1-X', '1000.00', 'PO-00000446'),
(TRHU4249449, '4312970', '3240.00', '4550735164'),
(TRHU4238260, '741-GWPBundle-TW', '170.00', 'NECTAR2022MH241'),
(TRHU3335270, '1301291', '60000.00', '4500330599'),
(TRHU3070607, '36082233', '150.00', '11199460'),
(TLLU8519560, 'BGM03AWFX', '360.00', 'PO10181A'),
(TLLU8519560, '10-1067', '9120.00', 'PO10396'),
(TLLU8519560, 'LUNA-KP-SS', '8704.00', '4782'),
(TLLU5819760, 'GS-1319', '10000.00', '62719'),
(TLLU5819760, '2020124775', '340.00', '3483'),
(TLLU5389611, '1049243', '63200.00', '4500343723'),
(TLLU4920852, '40-21-72194', '22.00', '53839'),
(TRHU3335270, '4312904', '1050.00', '4550694829'),
(TLLU4540955, '062-06-4580', '86.00', '1002529'),
(TRHU3335270, 'BGM03AWFK', '1000.00', 'PO9912'),
(TLLU4196942, 'Classic Dining Chair,Walnut Legs, SF XH1', '3290.00', 'P279'),
(TLLU4196942, 'BGM61AWFF', '852.00', 'PO10365');

我正在尝试根据此信息更新另一个表,但使用

GROUP_CONCAT()
.

GROUP_CONCAT(item_id),
GROUP_CONCAT(quantity),
GROUP_CONCAT(po_num) -- grouping by equipment_num field.

我用 GROUPED by equipment_num 和上述字段的 Group_concats 更新了另一个表。我能够使用中间 TEMPORARY 表做我想做的事。由于我需要的是数量列表,所以我做

GROUP_CONCAT(CONCAT(quantity,''))

DROP TABLE __tmp__;
CREATE TABLE __tmp__
SELECT equipment_num, GROUP_CONCAT( item_id ), GROUP_CONCAT(CONCAT(  quantity ,  '' ) ), GROUP_CONCAT( po_num )
FROM  `test_tbl`
GROUP BY equipment_num

最后我以我想要的格式将信息拉到目标表:

UPDATE `dest_tbl` AS ms
INNER JOIN `__tmp__` AS isn
ON ( ms.equipment_num = isn.equipment_num )
SET ms.item_id = isn.item_id,
ms.piece_count = isn.quantity,
ms.pieces_detail = isn.po_num 

什么是生成执行

group_concat
部分的派生查询然后将该派生查询结果推送到最终目标表的单个查询?

我试图避免使用临时表。 我在想:

UPDATE dest
INNER JOIN(
    SELECT src.equipment_num, GROUP_CONCAT(src.item_id) as item_id, 
        GROUP_CONCAT(CONCAT(src.quantity)) as quantity, 
        GROUP_CONCAT(src.po_num) as po_num
    FROM  `item_shipped_ns` as src
    INNER JOIN milestone_test_20221019 as dest
    ON(src.equipment_num=dest.equipment_num)
    WHERE src.importer_id='123456'
    GROUP BY src.equipment_num
    ) as tmp
ON (src.equipment_num=tmp.equipment_num)
SET 
dest.item_num=tmp.item_id,
dest.piece_count=tmp.quantity,
dest.pieces_detail=tmp.po_num;

#1146 - 表 'fgcloud.dest' 不存在

我对表别名有疑问。应该更新的表是

milestone_test_20221019
——它被声明为
dest
,但它找不到它。在更新
milestone_test_20221019
之前获取信息和聚合的源表是
item_shipped_ns
并且那个
tmp
表是派生/子查询表别名。

mysql subquery group-concat
2个回答
2
投票

你需要给

GROUP_CONCAT()
一个别名,这样你就会得到一个名为
item_id
的列。它不会自动使用
GROUP_CONCAT()
的参数作为结果列的名称。

CREATE TABLE __tmp__
SELECT equipment_num, 
    GROUP_CONCAT( item_id ) AS item_id, 
    GROUP_CONCAT( quantity ) AS quantity, 
    GROUP_CONCAT( po_num ) AS po_num
FROM  `test_tbl`
GROUP BY equipment_num

要在不创建

__tmp__
表的情况下在单个查询中执行此操作,只需将用于创建
__tmp__
的查询放在
UPDATE
.

的子查询中
UPDATE milestone_test_20221019 AS dest
JOIN (
    SELECT equipment_num, 
        GROUP_CONCAT( item_id ) AS item_id, 
        GROUP_CONCAT( quantity ) AS quantity, 
        GROUP_CONCAT( po_num ) AS po_num
    FROM  item_shipped_ns
    GROUP BY equipment_num
) AS src ON dest.equipment_num = src.equipment_num
SET dest.item_id = src.item_id,
    dest.quantity = src.quantity,
    dest.po_num = src.po_num

0
投票

下面是一个示例,说明如何将 UPDATE 与 GROUP_CONCAT() 以及数量字段的隐式-显式转换一起使用。

UPDATE milestone_test_20221019 as dest
INNER JOIN(
    SELECT src.equipment_num, GROUP_CONCAT(src.item_id) as item_id, 
    GROUP_CONCAT(CONCAT(src.quantity,'')) as quantity, 
    GROUP_CONCAT(src.po_num) as po_num
    FROM  item_shipped_ns as src
    INNER JOIN milestone_test_20221019 as t1
    ON (src.equipment_num=t1.equipment_num)
    WHERE src.importer_id='4081836'
    GROUP BY src.equipment_num
    ) AS tmp
ON (tmp.equipment_num=dest.equipment_num)
SET 
dest.item_num=tmp.item_id,
dest.piece_count=tmp.quantity,
dest.pieces_detail=tmp.po_num;
© www.soinside.com 2019 - 2024. All rights reserved.