基于mysql中两个表的JOIN更新多个字段

时间:2018-03-31 15:28:19

标签: mysql

我正在尝试将下面的2个Update语句合并到一个查询中,因为它们都在同一个表上工作。

我的学校。现状计数根据孩子的数量更新。出勤=现状

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') 

有没有更好的方法来实现这一目标,还是上述效率最高?

1 个答案:

答案 0 :(得分:1)

使用包含两个聚合的更新联接:

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;