[英]mysql shrink where clause
我有一個表,該表具有10列和24行,可以存儲一個值或可以等於0。它們被稱為msg1,msg2 ...直至msg10。 我正在編寫一個查詢以用0而不是任何字段中的特定值更新該表。
因此,我寫道(59是一個測試值,並將由php動態更新):
UPDATE schedule SET msg1='0' WHERE msg1='59' OR SET msg2='0' WHERE msg2='59'....
OR SET msg10='0' WHERE msg10='59'
這顯然是行不通的,而且無論如何將是我見過的效率較低的查詢之一。 因此,問題是:一種遍歷所有行和列,尋找特定值(即59),如果是的話將其更改為0的聰明方法是什么?
我知道我可以使用for循環來做到這一點,但這最終將在每次24次查詢時執行…效率也不高!
您將不得不引用每一列。 我只需要對表進行全面掃描,並更新每一行。 索引無濟於事,不需要WHERE
子句。 假設這些列是字符,請在值周圍使用單引號。 如果是數字,則可以省略單引號。
UPDATE schedule
SET msg1 = IF(msg1='59','0',msg1)
, msg2 = IF(msg2='59','0',msg2)
, msg3 = IF(msg3='59','0',msg3)
, ...
如果要添加WHERE
子句(實際上並不需要),則可以在SET
子句之后添加它。
WHERE msg1='59'
OR msg2='59'
OR msg3='59'
我很想編寫該語句,因此只需要一次指定值'59'
和'0'
,如下所示:
UPDATE schedule s
CROSS
JOIN (SELECT '59' AS oldval, '0' AS newval) v
SET s.msg1 = IF(s.msg1=v.oldval,v.newval,s.msg1)
, s.msg2 = IF(s.msg2=v.oldval,v.newval,s.msg2)
, s.msg3 = IF(s.msg3=v.oldval,v.newval,s.msg3)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.