我正在尝试将以下 2 个更新语句合并到一个查询中,因为它们都在同一个表上工作。
我的 school.present 计数根据 children.attendance=PRESENT 状态的计数更新
UPDATE school s SET s.present=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.attendance='PRESENT')
同样,school.danced 计数根据 children.activity=DANCE 状态的计数更新
UPDATE school s SET s.danced=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.activity='DANCE')
是否可以将两者合并以节省查询数量?
我目前的尝试是将两者合并到以下内容中 - 但我认为这将导致与上面相同的两个查询
UPDATE school s SET
s.danced=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.activity='DANCE'),
s.present=(SELECT count(children.id) FROM children c
WHERE c.school_id =s._id AND c.attendance='PRESENT')
是否有更好的方法来实现这一目标,或者上述方法是否尽可能高效?
最佳答案
使用包含两个聚合的更新连接:
UPDATE school s
INNER JOIN
(
SELECT
school_id,
COUNT(CASE WHEN attendance = 'PRESENT' THEN 1 END) AS p_cnt,
COUNT(CASE WHEN attendance = 'DANCE' THEN 1 END) AS d_cnt
FROM children
GROUP BY school_id
) c
ON s._id = c.school_id
SET
present = c.p_cnt,
danced = c.d_cnt;
关于mysql - 基于mysql中两个表的JOIN更新多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49589385/