2014-10-07 70 views
0

我需要建立一個mysql查詢執行以下操作:MySQL的更新如果SELECT查詢

  • 選擇行的計數用戶從職位表
  • 更新與ID行的列字段= 15只有當計數結果小於或等於5

這是我曾嘗試:

UPDATE posts SET post_title = 'my title' IF(SELECT COUNT(ID) FROM posts WHERE (post_status = 'saved' AND user_id = 1) <= 5) WHERE ID = 15 

問題: 是否可以在單個查詢中執行這些類型的操作?

+0

@ spencer7593更新需要做的只有一列其中有我已經更新的15的ID問題 – Mark 2014-10-07 01:23:35

回答

2

是的,這是可能的。將子查詢合併到UPDATE語句中有幾種方法。

的一種方法是使用多表更新,和使用內聯視圖返回計數:

UPDATE posts p 
    JOIN (SELECT COUNT(c.id) AS cnt 
      FROM posts c 
      WHERE c.post_status = 'saved' 
      AND c.user_id = 1 
     ) v 
    ON v.cnt <= 5 
    SET p.post_title = 'my title' 
    WHERE p.id = 15 
    LIMIT 1 

內聯視圖查詢(別名爲v)首先運行。這將返回一行(因爲COUNT聚合)。然後我們使用連接操作來匹配posts表中的行(別名爲p)。

對於連接謂詞,我們引用了內聯視圖中返回的「count」。如果這大於五,那麼它將不匹配posts表中的任何行,因此不會更新行。

有幾種方法,以獲得相同的結果:

UPDATE (SELECT COUNT(c.id) AS cnt 
      FROM posts c 
      WHERE c.post_status = 'saved' 
      AND c.user_id = 1 
     HAVING COUNT(c.id) <= 5 
     ) v 
    JOIN posts p 
    ON p.id = 15 
    SET p.post_title = 'my title' 
LIMIT 1 

或者

UPDATE posts p 
    SET p.post_title = 'my title' 
WHERE p.id = 15 
    AND (SELECT COUNT(c.id) AS cnt 
      FROM posts c 
      WHERE c.post_status = 'saved' 
      AND c.user_id = 1 
     ) <= 5 
LIMIT 1 
+0

+1,像這樣的方法 – radar 2014-10-07 01:30:59

+0

謝謝斯賓塞! – Mark 2014-10-07 02:10:48