我需要构建一个执行以下操作的mysql查询:
以下是我的尝试:
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 :(得分: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