Mysql 根据 1 行更新 6 行

Mysql update 6 rows based on 1 row

我有一个名为 "wp_postmeta"

的 wordpress 数据库 table

看起来像这样(简化)

meta_id     post_id meta_key        meta_value
1           5       _price          -
2           5       _visibility     -
3           5       _stock          -
4           5       _stock_status   -
5           5       _sale_price     -
6           5       _regular_price  -
7           5       _sku            REALSKU

我需要更新所有_price、_visibility、_stock、_stock_status、_sale_price、_regular_price based on meta_value of _sku

我试过了,但无法添加另一个 meta_values 进行更新,所以它只更新基于 sku 的 _price:

UPDATE wp_postmeta a
JOIN wp_postmeta b  ON a.post_id = b.post_id
AND b.meta_key = '_sku'
AND b.meta_value LIKE 'RELASKU'

SET a.meta_value = '5'
WHERE a.meta_key = '_price'

请帮忙!

您可以使用 case:

UPDATE wp_postmeta a JOIN
       wp_postmeta b 
       ON a.post_id = b.post_id AND
          b.meta_key = '_sku' AND
          b.meta_value LIKE 'RELASKU'
     SET a.meta_value = (CASE WHEN a.meta_key = '_price' THEN '5'
                              WHEN a.meta_key = '_visibility' . . .
                              ELSE a.meta_value
                         END)
WHERE a.meta_key IN ('_price', '_visibility', . . . );

我相信你可以通过 CASE 语句实现你所需要的,例如:

SET a.meta_value = CASE a.meta_key
    WHEN '_price' THEN '5'
    WHEN '_visibility' THEN '6'
    ELSE a.meta_value
END

我已经为你写了查询。我希望它能解决你的问题:

查询

UPDATE wp_postmeta a
       JOIN
     wp_postmeta b ON a.post_id = b.post_id
        AND b.meta_key = '_sku'
        AND b.meta_value LIKE 'RELASKU' 
SET 
    a.meta_value = 
    IFNULL(( CASE 
        WHEN a.meta_key = '_price' THEN  '13.5'
        WHEN a.meta_key = '_visibility' THEN  'None'
        WHEN a.meta_key = '_stock' THEN  '12'
        WHEN a.meta_key = '_stock_status' THEN  'Available'
        WHEN a.meta_key = '_sale_price' THEN  '12.5'
        WHEN a.meta_key = '_regular_price' THEN  '13.0'
     END),a.meta_value);