2014-10-07 65 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