MySQL如何从许多详细记录更新1个主记录

时间:2012-03-04 12:41:03

标签: mysql sql

我有2张桌子 - 主人和细节。这是主人和细节之间的一对多关系。

在许多其他列中,master table具有:

id column (index)
total column

在许多其他列中,details table具有:

id column (index)
value column

SQL UPDATE语句可以将这两个表连接在一起,UPDATE master.total with the sum of details.value where master.id = details.id

谢谢你的帮助。

3 个答案:

答案 0 :(得分:3)

看起来像:

UPDATE 
master m 
INNER JOIN
( 
    SELECT d.id, SUM(d.value) AS valueSum
    FROM details 
    GROUP BY d.id
) AS g
  ON m.id = g.id
SET m.total = g.valueSum

答案 1 :(得分:3)

update master as m 
set total=
(select sum(value) from detail as d where d.id=m.id)

答案 2 :(得分:1)

这是我的最终SELECT语句最终看起来像:

// update all scored nominations "total score" and "average score" for current year where nomination approved and not locked
mysql_query('
    UPDATE nomination_bak AS nomination
    SET
        nomination_score = (
            SELECT SUM(total_score)
            FROM essayScores_bak AS essayScores
            WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year
        ),
        nomination_average = (
            SELECT AVG(total_score)
            FROM essayScores_bak AS essayScores
            WHERE essayScores.nomination_sequence = nomination.nomination_sequence AND essayScores.nomination_year = nomination.nomination_year AND essayScores.total_score > "0"
        )
    WHERE nomination.nomination_year = "' . NOMINATION_YEAR . '" AND nomination.nomination_approved = "Y" AND nomination.nomination_locked = "N"
') or die('tallyScores(nominationTable): ' . mysql_error());

每个表的“_bak”部分只是显示我在我的表的备份副本上测试了它。