2014-02-06 49 views
0

阅读大约TriggersEqui-Joinscross-joins我的头部旋转,无法弄清楚我需要什么。基于另一个表格自动插入数据

基本上,我有3个表:

Table 1: Users 
    id 
    username 
    score 

Table 2: Acts 
    act_id 
    act 
    user_id 
    act_score 

Table 3: Votes 
    vote_id 
    act_id 
    user_voter 
    score_given 

当投票演员,我希望MySQL的score_given自动添加到用户score' and to the act_score`。

这是可能的,我需要什么类型的JOIN和/或TRIGGER。如果有人感到非常慷慨,他们能否提供给我sql代码?我真的努力让我解决这个头......

+0

你需要更新后触发投票表。 – Melon

回答

1

我会建议使用VIEW为需要计算分数每个UserAct。这将保证分数总是正确的,你不需要很多触发器。

更新:

1)从UsersActs表删除得分;

2)创建的图ActsWithScore

CREATE VIEW ActsWithScore AS 
SELECT 
    *, 
    (SELECT SUM(Votes.score) FROM Votes WHERE Votes.act_id = Acts.act_id) AS act_score 
FROM Acts; 

3)创建视图UsersWithScore

CREATE VIEW UsersWithScore AS 
    SELECT 
     *, 
     (SELECT SUM(ActsWithScore.act_score) FROM ActsWithScore WHERE ActsWithScore.user_id = Users.id) AS user_score 
    FROM Users; 

4)现在,可以通过下面的命令查询数据:

SELECT * 
FROM UsersWithScore 

SELECT * 
FROM ActsWithScore 

已完成所有这些更改后,不要忘了更改UsersUsersWithScoreActsActsWithScore在所有的地方,要查询的分数。

PS。对不起,我现在手边没有MYSQL,如果有一些语法错误,我就没有MYSQL了。

+0

我该如何使用VIEW? – Wildcard27

+0

谢谢,现在就试试。我没有改变我的脚本中的任何内容,因为我还没有实施投票/评分系统。我们正在开始构建它:) – Wildcard27

+0

使用'VIEW's进行示例更新。我真的推荐切换到这个解决方案,因为'TRIGGER'通常被认为是一种不好的做法,因为他们在更新数据时可以做出意想不到的事情。 –

0
CREATE TRIGGER TRIGGER_NAME 

AFTER INSERT ON TABLE_1 
FOR EACH ROW 
BEGIN 
// Insert into another table values (new.x, new.y...); 
END; 
+0

http://www.mysqltutorial.org/create-the-first-trigger-in-mysql.aspx –

+0

我猜我只是在'mysqladmin'的sql部分输入这个,它会自动设置? – Wildcard27

+0

如果你有heidiSql或者编辑器,你可以在桌面上右键n做 –

1

触发器是最明显的解决方案,但它可能会增加维护问题。如果你的应用程序不是那么大/复杂,你会生病。 另外我更喜欢在业务层进行两种插入。如果你正在做一个插入,为什么不做两个插入?它会给你的应用程序增加开销,但是如果你的应用程序不是这样的,那么数千次/秒你就不好处理。

+0

您可以轻松进入“不同步”状态,因为您可能很容易忘记更改数据库中的所有信息。 –

+0

良好的业务层实现不能允许这样做。触发就像一个触发SP执行的事件。该触发器可能会破坏您的数据(如果不将关系完整性和事务良好使用,很可能会发生)。顺便说一句,我喜欢你的观点建议取决于情况是我可以使用的。 – jean

+0

我主要同意你的观点,业务层的良好实现不会允许数据“不同步”,并且你应该没问题,但是你不能确定每件事都会经过这个层。就像在每一个现实生活中的应用程序一样,您可能会遇到需要在数据库中手动更正一些数据 - 无论是因为错误还是用户错误。如果没有数据重复,并且您不需要在不同地方更新数据,则此类情况会更好。但正如您已经说过的,完全取决于我们正在讨论的是什么类型的应用程序。 –

相关问题