阅读Triggers
,Equi-Joins
和cross-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 :(得分:1)
我建议使用VIEW
根据需要计算每个User
或Act
的分数。这将保证分数始终是正确的,您不需要很多触发器。
<强>更新:强>
1)从Users
和Acts
表中删除分数;
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
完成所有这些更改后,请不要忘记在您查询分数的所有地方将Users
更改为UsersWithScore
并将Acts
更改为ActsWithScore
PS。对不起,我现在手头没有MYSQL,如果有一些语法错误,请耐心等待。
答案 1 :(得分:1)
触发器是最明显的解决方案,但它可能会增加维护问题。如果你的应用程序不是那么大/复杂,你就可以了。 另外,我更喜欢在业务层进行两次插入。如果您正在进行插入,为什么不进行两次插入?它可能会增加你的应用程序的开销,但如果你的应用程序不是那么做几千次/秒,那你就没事了。
答案 2 :(得分:0)
CREATE TRIGGER TRIGGER_NAME
AFTER INSERT ON TABLE_1
FOR EACH ROW
BEGIN
// Insert into another table values ( new.x, new.y...);
END;