子查询无返回结果时,如何用单SQL语句更新Post表的top_comment
解决方案
直接将top_comment的赋值改为标量子查询即可,当没有符合条件的获赞评论时,子查询会返回NULL,自动将字段更新为NULL:
UPDATE post SET top_comment = ( SELECT body FROM comment WHERE count_like > 0 AND fk_post = 1 ORDER BY count_like DESC LIMIT 1 ) WHERE pk_post = 1;
原语句的问题分析
你原来的写法使用了FROM子查询关联的方式:如果子查询没有返回任何行(所有评论都无点赞),整个UPDATE语句找不到匹配的更新行,因此不会执行任何更新操作,top_comment会保留原来的值。
而改用标量子查询赋值的方式后,无论子查询是否有结果,都会对WHERE pk_post = 1匹配到的帖子行执行更新:
- 存在获赞评论时,子查询返回获赞最高的评论内容,正常更新;
- 无获赞评论时,子查询返回
NULL,自动将top_comment设为NULL。
这个写法在MySQL、PostgreSQL、SQL Server等主流关系型数据库中都能正常工作。
内容的提问来源于stack exchange,提问作者Dercni
相关产品推荐
相关产品推荐

