Mysql

在 WordPress/WooCommerce 表中,價格被沖洗掉了。如何重新排列它們?(鍵=值結構)

  • March 2, 2016

我們在我們的 WordPress/Woocommerce 表(因此是 mySQL)ab_postmeta 中有一些產品的銷售(折扣)價格。

我們認為通過 SQL 查詢(而不是通過 WordPress,因為它們太多)來重置銷售價格是可以的。我們所做的是:

Update ab_postmeta set meta_value='' where meta_key='sale_price'

對於 WordPress 的某些部分,它對其他部分無效。經過仔細檢查,我們發現ab_postmeta表還有其他值,這些值應該重置為正常價格才能正常工作。我們的主要困難是表格具有垂直鍵=值佈局,結構如下:

ab_postmeta

  • meta_id - PC
  • post_id - 對文章/產品的 FK
  • meta_key - 鍵
  • meta_value - 上面的鍵(屬性)的值

基本上,我們需要一個更新查詢,它將獲取meta_key=’_max_variation_regular_price’的(數字)值並將其放入meta_key=’_price’meta_key=’_max_variation_sale_price’以及****相同 post_id的其他鍵值中。如果我們從控制台為每個目標鍵多次執行 SQL 查詢,就可以了。

怎麼做?(我不敢嘗試,因為我在現場數據庫上)。

更新:

這是一個數據範例:(我們需要做的是:所有“263”必須變為“329” - 我們必鬚根據Post_id(必須相同)和meta_key從一個源記錄複製到另一個目標記錄-必須有相應的值):

樣本數據

更新 2:事實上,我們需要在 SQL 中翻譯以下內容:“對於每個post_idmeta_value哪裡獲取值meta_key='_max_variation_regular_price'並將其放在meta_value哪裡(例如)meta_key='_price'(我們將為我們需要的每個目標行更改您的範例)

我對您的問題的翻譯是(與您的描述略有不同):

對於每一個,從where 列中post_id找到值並將其放入所有其他行中,其中元鍵是“價格”(即)*。meta_value``meta_key = '_max_variation_regular_price'``meta_value``post_id``meta_key LIKE '%\_price'

現在,在我們做任何事情並更改生產數據庫中的數據之前,最好的方法是進行備份,將備份恢復為另一個數據庫並在恢復(複製)的數據庫中進行操作,我們不會介意犯錯誤。

讓我們確定具有我們需要的值的行:

-- query1
SELECT post_id, meta_value AS price
FROM ab_postmeta  
WHERE meta_key = '_max_variation_regular_price' ;

如果(post_id, meta_key)有一個UNIQUE約束,這就是我們需要的所有值。如果沒有,我們可能需要採取額外的步驟來確保結果對於每個post_id而不是更多(跳過這一步)都有一個值。

現在,讓我們找到需要更新的行:

-- query2
SELECT post_id, meta_key, meta_value 
FROM ab_postmeta  
WHERE meta_key LIKE '%\_price' 
 AND meta_key <> '_max_variation_regular_price' ;

然後我們可以將兩個選擇合二為一:

-- query3
SELECT upd.post_id, upd.meta_key, 
      upd.meta_value  AS old_price,
      good.meta_value AS good_price 
FROM ab_postmeta AS good             -- the table with the good prices
 JOIN ab_postmeta AS upd            -- the table to be updated
   ON good.post_id = upd.post_id
WHERE good.meta_key = '_max_variation_regular_price' 
 AND upd.meta_key LIKE '%\_price' 
 AND upd.meta_key <> '_max_variation_regular_price' ;

我們可以執行它並檢查結果以查看更新的內容。還沒UPDATE跑!. 之後——如果檢查看起來正確——我們可以執行實際的UPDATE. 請注意,它與上一個非常相似SELECTWHERE子句是相同的,子句FROM變成了UPDATE。但我們將在事務中執行此操作,以確保:

BEGIN ;           -- start a transaction. 

UPDATE ab_postmeta AS good           -- the table with the good prices
 JOIN ab_postmeta AS upd            -- the table to be updated
   ON good.post_id = upd.post_id
SET
   upd.meta_value = good.meta_value
WHERE good.meta_key = '_max_variation_regular_price' 
 AND upd.meta_key LIKE '%\_price' 
 AND upd.meta_key <> '_max_variation_regular_price' ;

讓我們再次執行 query2,檢查新值:

SELECT post_id, meta_key, meta_value 
FROM ab_postmeta  
WHERE meta_key LIKE '%\_price' 
 AND meta_key <> '_max_variation_regular_price' ;

現在,一切都好嗎?所有更新看起來都不錯嗎?

  • 如果沒有,執行ROLLBACK ;並且沒有造成任何傷害。重新開始,通過評估您的算法或使用較小的集合執行。
  • 如果是,請執行COMMIT ;,更改將是永久性的。您可以在生產中(再次)安全地執行此操作。

*感謝 Andriy 修復錯誤。應該使用萬用字元來LIKE轉義_字元。\_

引用自:https://dba.stackexchange.com/questions/130896