Mysql根据1行更新6行

时间:2015-09-01 13:46:43

标签: mysql wordpress woocommerce

我有一个名为“wp_postmeta”的wordpress数据库表

看起来像这样(简化)

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

我需要根据_sku的meta_value更新所有_price,_visibility,_stock,_stock_status,_sale_price,_regular_price

我尝试了这个,但无法为更新添加其他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'

请帮忙!

3 个答案:

答案 0 :(得分:1)

您可以使用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', . . . );

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

<强>查询

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);