簡體   English   中英

mysql收縮where子句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM