如何将基于两表关联的两个MySQL更新语句合并为单查询
合并两个UPDATE语句为单个查询的解决方案
没问题!你完全可以把这两个更新操作合并成一个查询,这样能减少数据库访问次数,效率更高。下面给你两种可行的写法:
写法一:直接在SET子句中包含两个统计子查询
这种写法最直观,和你原来的逻辑保持一致,只是把两个更新字段放在同一个UPDATE语句里:
UPDATE school s SET s.present = (SELECT COUNT(c.id) FROM children c WHERE c.school_id = s._id AND c.attendance = 'PRESENT'), s.danced = (SELECT COUNT(c.id) FROM children c WHERE c.school_id = s._id AND c.activity = 'DANCE')
写法二:用聚合子查询一次性计算统计值(更高效)
如果你的数据集比较大,上面的写法会扫描两次children表。下面的写法只需要扫描一次表,通过条件聚合算出每个学校的两个统计值,再关联更新,性能更优:
UPDATE school s JOIN ( SELECT school_id, COUNT(CASE WHEN attendance = 'PRESENT' THEN id END) AS present_count, COUNT(CASE WHEN activity = 'DANCE' THEN id END) AS danced_count FROM children GROUP BY school_id ) c_stats ON c_stats.school_id = s._id SET s.present = c_stats.present_count, s.danced = c_stats.danced_count
第二种写法里,CASE WHEN会只统计符合条件的记录,COUNT会忽略NULL值,刚好能得到我们需要的数量,非常适合这种多维度统计的场景。
内容的提问来源于stack exchange,提问作者HopeKing
相关产品推荐
相关产品推荐

