2011-12-05 109 views
12

我面臨着SQL查詢的複雜情況。任務是更新多個行,具有多個值和多個條件。以下是我想要更新的數據; 字段更新:「銷售」,條件字段:「campid」和「日期」:更新具有多個值和多個條件的多行mysql

if campid = 259 and date = 22/6/2011 then set sales = $200 
else if campid = 259 and date = 21/6/2011 then set sales = $210 
else if campid = 260 and date = 22/6/2011 then set sales = $140 
else if campid = 260 and date = 21/6/2011 then set sales = $150 

我要更新所有這些在一個查詢。

+0

投票反對downvote沒有評論。我認爲如果有人不瞭解交易,這是一個合理的問題。 –

回答

19

試試這個:

UPDATE your_table SET sales = 
CASE 
    WHEN campid = 259 AND date = 22/6/2011 THEN 200 
    WHEN campid = 259 AND date = 21/6/2011 THEN 210 
    WHEN campid = 259 AND date = 22/6/2011 THEN 140 
    WHEN campid = 259 AND date = 21/6/2011 THEN 150 
    ELSE sales 
END 

當然,我不知道日期字段是否真的是DATE或DATETIME,所以我留下了查詢,顯示你可以做什麼,但也許你必須根據數據類型修復日期比較。 如果日期字段是DATE(因爲它應該),您可以編寫AND date = '2011-06-22'等。
注意ELSE條件:有必要避免記錄不落在其他情況下將被設置爲NULL。

+0

謝謝Marco。 –

+0

我在我的問題中使用了這個例子,它工作。經過很長時間,我得出結論,這種類型的查詢在少量數據上提供最佳性能。如果表中有數百萬條記錄,則使用參數中的主鍵一次更新單條記錄會節省大量時間,從而產生更好的性能。 –

+0

謝謝,我救了這個夜晚 –

1

你當然不應該在單個查詢中做這些事情。相反,如果您的目標是以原子方式自動更新它們,則應同時在單個交易中發出幾條UPDATE對帳單。

你不會說你使用哪個MySQL版本,也不會說哪個存儲引擎。假設InnoDB的 - 這是標準的最新版本的MySQL和一般應使用交易系統 - 也假設你在命令行客戶這樣做,你會

mysql> set autocommit=0; 
mysql> UPDATE ....; 
mysql> UPDATE ....; 
mysql> ... 
mysql> commit; 

然後,您可以重新啓用自動提交,如果你像通過重複第一線,但隨着1值:

mysql> set autocommit=1; 
+0

imo,這不回答什麼OP要求 – ajreal

+0

我虛心不同意。問題中提出的If-elseif-elseif等構造,加上他想同時更新所有字段的說法,正是我的答案所能做到的。當然,還有其他方法可以做到這一點,如果一個陳述真的需要(!)。 –

+0

丹尼爾是正確的。我曾要求多次執行某些條件。 –

1

與其寫出一個太複雜且涉及時間的sql查詢,我相信你會花更多的時間寫一個數據訪問對象來處理每個記錄的這些相當簡單的操作。這使得代碼的後續維護,以及使用您的數據訪問對象開發新代碼比一次性使用複雜的SQL查詢更容易。