2016-04-17 160 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