2012-03-04 94 views
1

我有2個表 - 一個主和細節。這是主對象與細節之間的一對多關係。MySQL如何更新來自許多詳細記錄的1條主記錄

以及許多其他列,則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

感謝您的幫助。

回答

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

你能解釋一下這個答案和MGA之間的區別嗎? – 2012-03-04 12:59:08

+0

完美的@hago作品。謝謝!由於簡單和它在我的第一次傳遞中起作用的事實表明這是回答。 – 2012-03-04 13:32:37

+0

@ypercube感謝MGA,他的回答可能比我的要快。我可能會多次執行對細節表的查詢,並且他只使用一次內部連接查詢細節表,特別是當您有大量數據時,我的操作只是簡單易懂。 – hago 2012-03-04 15:28:34

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 
+0

謝謝@MGA。現在嘗試。 – 2012-03-04 12:46:00

+0

我試過這個,但考慮到整個語法和我複雜的現有INNER JOIN ON語法的複雜性(我知道這是有效的)我得到'你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以獲取在接近'處使用的正確語法。所以我會嘗試[在] hago的版本低於 – 2012-03-04 13:23:38

+0

它看起來不錯,可能工作。我無法讓它爲我工作。由於事實上我投了其他答案,我馬上就開始工作。感謝分享。 – 2012-03-04 13:33:59

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」 部分只是表明我測試了這個在我的表的備份副本上。