2016-04-17 157 views
1

我有2個表TESTUserInfo和BlockRanking。更新另一個表時更新表

TestUserInfo是一羣用戶信息和他們的特定用戶的總數。每個用戶也有一個與其用戶相關的區域。

在BlockRanking中,我將所有用戶與每個區域相結合,並將該區域的所有總點數相加。

我有這個查詢從TESTUserInfo插入表BlockRanking值,它的工作原理。

INSERT INTO BlockRanking (zone, total) 
SELECT zone, SUM(total) 
FROM TESTUserInfo 
GROUP BY zone 
ORDER BY SUM(total) DESC 

現在我正在嘗試做類似的事情,但是我想在TESTUserInfo更新時更新BlockRanking。我特別想在BlockRanking分組之後更新區域和這些區域的總數。

我希望這是一個觸發器,所以當TESTUserInfo更新時,BlockRanking也會更新,或者是基於時間的。如果這些不可能,只是查詢也會起作用。

+0

看一看MySQL的觸發器:https://dev.mysql.com/doc/refman/5.5/en/trigger-syntax.html – Thomas

+0

@Thomas感謝您的建議。我已經查看了該網站,無法找出我的查詢的更新。插入工程很好,但我無法更新BlockRanking表。 – natedawg12

回答

0

當某些查詢在表上運行時,您可以使用triggers來運行任務。一個觸發器爲每個插入的行運行一次。我們可以跟蹤TESTUserInfo表到達時添加到TESTUserInfo表中的總數,而不是聚合。

CREATE TRIGGER update_totals AFTER INSERT ON TESTUserInfo 
    FOR EACH ROW 
    BEGIN 
    INSERT INTO BlockRanking 
     (zone, total) 
     VALUES 
     (NEW.zone, NEW.total) 
    ON DUPLICATE KEY UPDATE 
     total = total + VALUES(total); 
    END; 

注意zone將不得不在BlockRanking唯一索引。

如果可以在TESTUserInfo中更新或刪除行,您同樣需要創建觸發器。對於UPDATE觸發器,您可以執行如下操作:total = total + NEW.total - OLD.total

參見:

Trigger to update row in another table

+0

我認爲這正是我所需要的。我正在使用phpmyadmin並且對它來說是相當新的。它表示「total = total + VALUES('total');」我也開始插入我的觸發器,因爲我相信以前的代碼在phpmyadmin中不是必需的。 – natedawg12

+0

我目前無法進行調試。你可以嘗試'total = total + VALUES(total)',並且可以在整個查詢中顯式地命名錶,所以'BlockRanking.zone'而不是'zone'和'BlockRanking.total'而不是'total'。給我實際的錯誤信息也會有幫助。 :) 請注意,我最初犯了一個錯誤,插入的值應該是'(NEW.zone,NEW.total)',而不是'(NEW.zone,total + NEW.total)'。此時,還沒有以前的「總計」可用。 'ON DUPLICATE KEY UPDATE'負責求和。 – Thomas

+0

我得到的具體錯誤是#1064您的SQL語法有錯誤;請檢查與您的MySQL服務器版本對應的手冊,以在第6行使用「total」附近的正確語法)。 – natedawg12