MySQL中如何在子查询中使用主查询信息完成更新操作?
解决方案
方法一:修正关联子查询(适配原语句逻辑)
原语句的核心问题是子查询无法直接引用主更新语句的同表字段,通过为主表设置别名并包装子查询为派生表,即可解决这个问题,同时补充处理无历史版本的场景:
UPDATE article_contents main SET version = ( SELECT COALESCE(MAX(version), 0) + 1 FROM (SELECT version, article_id, lang FROM article_contents) sub WHERE sub.article_id = main.article_id AND sub.lang = main.lang ) WHERE main.id = :id;
其中COALESCE(MAX(version), 0)用来处理首次发布的情况——当对应article_id和lang还没有正式版本时,MAX(version)会返回null,用COALESCE将其转为0,加1后得到第一个正式版本号1。
方法二:使用JOIN更新(更高效简洁)
用JOIN方式直接关联目标文章+语言的最大版本号,写法更直观,数据量较大时性能更优:
UPDATE article_contents main JOIN ( SELECT article_id, lang, COALESCE(MAX(version), 0) + 1 AS next_version FROM article_contents WHERE article_id = (SELECT article_id FROM article_contents WHERE id = :id) AND lang = (SELECT lang FROM article_contents WHERE id = :id) ) sub ON main.article_id = sub.article_id AND main.lang = sub.lang SET main.version = sub.next_version WHERE main.id = :id;
内容的提问来源于stack exchange,提问作者SteeveDroz
相关产品推荐
相关产品推荐

