MySQL UPDATE IF SELECT查询

时间:2014-10-07 01:13:31

标签: mysql

我需要构建一个执行以下操作的mysql查询:

  • 从帖子表中选择用户的行数
  • 仅当计数结果小于或等于5
  • 时,才更新ID = 15的行的列字段

以下是我的尝试:

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

问题: 是否可以在单个查询中执行这些类型的操作?

1 个答案:

答案 0 :(得分: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)。

对于连接谓词,我们从内联视图引用返回的“计数”。如果大于5,那么它将不匹配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