MYSQL批量按條件更新不一樣的數據

首先,咱們須要瞭解下MYSQL CASE EXPRESSION 語法。
php

手冊傳送門:http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.htmlhtml

有關這個的討論的stackoverflow:http://stackoverflow.com/questions/29205842/can-mysql-case-expression-running-well-with-the-same-when-conditionmysql


看完以上,你就會少走不少彎路。sql

我有不少條記錄須要更新不一樣的值怎麼辦呢?express

咱們能夠這樣:
app

UPDATE activity
SET number = CASE
WHEN aid = 45 THEN
    number + 1 
WHEN aid = 43 THEN
    number + 1 
END
WHERE
    aid IN (45, 43)

或者這樣:code

UPDATE activity
SET number = CASE aid 
WHEN 45 THEN
    number + 1 
WHEN 43 THEN
    number + 1 
END
WHERE
    aid IN (45, 43)

這個語法和程序語言中的switch case控制流差很少意思,可是有幾點須要注意:htm

ex1:element

UPDATE activity
SET number = CASE
WHEN aid = 45 THEN
    number + 1 
WHEN aid = 43 THEN
    number + 1 
WHEN aid = 45 THEN
    number + 3
WHEN aid = 49 THEN
    number + 1
WHEN aid = 45 THEN
    number + 1
END
WHERE
    aid IN (45, 43,49)

看到了嗎?會不會有人一開始像我同樣認爲aid=45 的number+5的?放心....aid=45 的number就僅僅加了1.換句話說也就是第一個when aid=45 then number+1執行了!第二次再碰到when aid=45的時候,系統就認爲這個條件已經執行過了,後門的aid=45就直接跳過不執行的了,可是中間的aid=43 aid=49的仍是能夠正常執行的!get

也就是說,全部相同的when條件就只執行第一次!


ex2:

UPDATE activity
SET number = CASE aid 
WHEN 45 THEN
    number + 1 
WHEN 43 THEN
    number + 1 
END

這個你以爲會怎麼樣?貌似和上面的沒啥不一樣啊?這個就糟糕了.....若是沒有約束條件,那麼aid=45 aid=43的number+1之外,別的aid都會set number=null.....這就好像你用簡單版的update set沒有寫where條件來約束範圍的狀況同樣。當心當心.....


這裏只討論瞭如何使用CASE EXPRESSION 來進行批量更新.....

不管是insert 或者update,批量處理老是要比一個個來的要效率,固然這裏指的是通常狀況下的使用。最後來看看在PHP下使用批量更新的處理方案:

/*
$aids is an array which the key is the activity's primary key and the 
value is the activity's number.
example $aids = array('45'=>4,'43'=>1...)
In the array,i combine all the same aid to one element.so one aid can 
not be used twice by the case expression.And  all the number are total
number.
*/
$sql = 'update huodong_activity set applynumber = case ';
$aids_str = implode(',',array_keys($aids)); 
foreach($aids as $k=>$v){
      $sql .= sprintf(' when aid = %d then applynumber-%d',$k,$v);
}
$sql .= ' END WHERE aid IN ('.$aids_str.') ';
$db->query($sql);

注意語句連接要適當給予空格....

相關文章
相關標籤/搜索