MySQL关联UPDATE语句求助:更新满足双条件的booking状态
解决MySQL中同时满足两个关联表条件的更新问题
你的原SQL逻辑存在疏漏:子查询仅筛选出存在单条article记录满足tid='xxx'且该条price≠9999的booking,但没有排除那些同一booking下还存在其他price=9999的article的情况,这导致第二个条件(该booking下不存在price=9999的article)没有被正确执行。
方案一:使用EXISTS与NOT EXISTS组合(推荐)
这种方式逻辑直观,且MySQL优化器能针对关联字段的索引做高效优化:
UPDATE booking b SET status = 'Preis-fertig' WHERE -- 条件1:当前booking下存在tid为'xxx'的article记录 EXISTS ( SELECT 1 FROM article a WHERE a.booking_Uid = b.Uid AND a.tid = 'xxx' ) -- 条件2:当前booking下不存在price为9999的article记录 AND NOT EXISTS ( SELECT 1 FROM article a WHERE a.booking_Uid = b.Uid AND a.price = 9999 );
方案二:使用分组聚合筛选
通过对article表按booking_Uid分组,聚合判断两个条件是否满足:
UPDATE booking SET status = 'Preis-fertig' WHERE Uid IN ( SELECT booking_Uid FROM article GROUP BY booking_Uid HAVING -- 统计分组中tid='xxx'的记录数,大于0表示存在该记录 SUM(CASE WHEN tid = 'xxx' THEN 1 ELSE 0 END) > 0 -- 统计分组中price=9999的记录数,等于0表示不存在该记录 AND SUM(CASE WHEN price = 9999 THEN 1 ELSE 0 END) = 0 );
补充说明
- 如果
article.booking_Uid、article.tid、article.price字段建立了索引,两种方案的执行效率都会大幅提升; - 方案一更适合单条件判断的场景,执行计划通常更高效;方案二更适合需要同时验证多个聚合条件的场景。
内容的提问来源于stack exchange,提问作者Freed
相关产品推荐
相关产品推荐

