2013-07-18 69 views
2

我正在更新2列和多行。目前,我正在運行兩個不同的查詢來完成此操作。是否有可能在一個查詢中完成它?是否可以將其合併爲一個查詢?

UPDATE `messages` SET `from_delete` = NOW() WHERE `thread_hash` = 'abc' AND `from_user_id` = '6' 

UPDATE `messages` SET `to_delete` = NOW() WHERE `thread_hash` = 'abc' AND `to_user_id` = '6' 
+0

什麼是'它'?你可以分享的任何代碼告訴我們關於「它」的信息嗎? –

+0

以簡單的英文描述查詢條件開始,你會發現它很難.... – Pleun

+0

它幾乎看起來像兩個查詢是適當的解決方案這\ – TGH

回答

1

是的,這是可能的,但它的棘手:

UPDATE `messages` 
    SET `from_delete` = IF(`from_user_id` = '6',NOW(),`from_delete`) 
    , `to_delete` = IF(`to_user_id` = '6',NOW(),`to_delete` ) 
WHERE (`thread_hash` = 'abc' AND `from_user_id` = '6') 
    OR (`thread_hash` = 'abc' AND `to_user_id` = '6') 

的「絕招」是使用條件的分配。如果行不應該更新,那麼將列的當前值分配給「不變」操作的列。

爲了完整性,您可能希望將thread_hash上的條件添加到條件。雖然這不會改變任何與查詢:

UPDATE `messages` 
    SET `from_delete` = IF(`thread_hash` = 'abc' AND `from_user_id` = '6' 
         ,NOW(),`from_delete`) 
    , `to_delete` = IF(`thread_hash` = 'abc' AND `to_user_id` = '6' 
         ,NOW(),`to_delete` ) 
WHERE (`thread_hash` = 'abc' AND `from_user_id` = '6') 
    OR (`thread_hash` = 'abc' AND `to_user_id` = '6') 
+0

@TGH:它回答了這個問題,是否可以在一個聲明中執行此操作。我已經使用這種技術,主要是爲了提高性能和可擴展性。更少的SQL語句意味着更少的往返數據庫。我們只需確保訪問計劃不比兩個單獨聲明的訪問計劃「惡化」。 – spencer7593

+0

我不反對它解決了這個問題。但是,我想知道如果在where子句中增加更多的複雜性,這種方法是否有難以維護的副作用。 – TGH

+0

我已經問過這個問題了。 – Xecure