2014-02-06 51 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

我主要同意你的觀點,業務層的良好實現不會允許數據「不同步」,並且你應該沒問題,但是你不能確定每件事都會經過這個層。就像在每一個現實生活中的應用程序一樣,您可能會遇到需要在數據庫中手動更正一些數據 - 無論是因爲錯誤還是用戶錯誤。如果沒有數據重複,並且您不需要在不同地方更新數據,則此類情況會更好。但正如您已經說過的,完全取決於我們正在討論的是什麼類型的應用程序。 –

相關問題