2015-04-30 85 views
1

我有2個表:自動更新的MySQL列

userGroups

id name users 
=================== 
1 abcd  2 
2 efgh  1 

users

id name groupId 
=================== 
1 Usr1  1 
2 Usr2  2 
3 Usr3  1 

我試圖根據用戶在該count使userGroups.users自動更新組。

有沒有辦法做到這一點?

謝謝。

+0

計數的更新執行插入我寧願運行SQL(也許是一個視圖)爲計數分組。如果你確實去觸發路線,你怎麼能確定它運行或沒有被禁用。 –

+0

我不確定你需要在一個組中存儲用戶的數量,這當然是你可以在用戶表中用'COUNT(*)'查詢的東西。 – AdamMc331

+0

給我上面的兩個人 - 通過觸發器保持計數結果更聰明,更快,更好。 DB更少,提供相同的結果。另外,如果你不是精神殘疾的人,你應該能夠確保觸發器運行。這也是相當微不足道的。 –

回答

3

您可以使用更新/插入/刪除觸發器來實現。

delimiter // 
CREATE TRIGGER grp_count_trigger AFTER UPDATE ON users 
FOR EACH ROW 
BEGIN 
    update userGroups g 
    left join 
    (
     SELECT groupId, count(*) as cnt 
     from users 
     group by groupId 
    ) u on u.groupId = g.id 
    set g.users = u.cnt; 
END 
// 
delimiter ; 

您還需要爲插入和刪除操作。

+1

你是怎麼從中得到這一切的?你必須在水晶球v.9或什麼 – Strawberry

+1

好的注意到,它也需要做插入,但我懷疑刪除以及,對嗎? – AdamMc331

+0

它不起作用。 「用戶」列保持不變。 – user2153436

0

更新users表時,檢查groupId是否已更改。如果是這樣,請增加新的groupId的計數並減少舊的groupId的計數。

用於插入和刪除增加或減少組的計數。

CREATE TRIGGER my_update_trigger AFTER UPDATE ON users 
    FOR EACH ROW if(NEW.groupId <> OLD.groupId) 
     UPDATE userGroups SET users = users + 1 WHERE groupId = NEW.groupId; 
     UPDATE userGroups SET users = users - 1 WHERE groupId = OLD.groupId; 
    END IF 

CREATE TRIGGER my_insert_trigger AFTER INSERT ON users 
    FOR EACH ROW UPDATE userGroups SET users = users + 1 WHERE groupId = NEW.groupId; 

CREATE TRIGGER my_delete_trigger AFTER DELETE ON users 
    FOR EACH ROW UPDATE userGroups SET users = users - 1 WHERE groupId = OLD.groupId; 

對於INSERT觸發器,您可能需要檢查計數行存在,如果不與計數1,而不是這樣做遞增1