2011-10-16 103 views
0

我得到了一張表,我允許相同的條目(重複,三重等),但我也有一個列,我希望每次都有一個條目進行更新的次數多少次存在。跟蹤多個相同的條目

所以我想編寫一個觸發器,我已經可以找到重複的條目做

select count(pid) from items group by pid having count(*); 

但事情是,這個查詢返回較少列的orinal表(原因有很多重複)

所以查詢和表之間沒有1對1的關係,所以我可以使用更新。我怎麼修改這個來得到想要的結果

謝謝高級。

+0

爲什麼你需要額外的列?當你需要那些信息時,你能不能通過pid運行計數? –

+0

因爲有成千上萬的條目和越來越多的連續添加,當有人查看一些條目通常是一個人或...所以我不能運行相同的查詢hundrends時間。它不太實用 – elasticrash

回答

1

您將面臨的主要問題是MySQL不允許您在修改items表本身(考慮這可能導致循環引用)後,使用AFTER INSERT ...觸發器修改items表。

一個解決方案是將計數存儲在一個單獨的表中(比如說items_pid_info)。此表的主鍵爲pid,並且該表將由主項表上的觸發器更新。當你需要訪問pidCount對於給定的pid,只需加入到這張表中,你就可以得到你的給定pid的最新pid數。因此:

create table items_pid_info  
(pid int unsigned not null primary key, 
pidCount int unsigned not null); 

現在創建INSERTUPDATEDELETE觸發對items表更新items_pid_info表:

DELIMITER && 

CREATE TRIGGER items_pid_count_ins_trg 
AFTER INSERT ON items 

FOR EACH ROW BEGIN 
DECLARE c int; 

set c := (select count(*) from items im where im.pid = NEW.pid); 

insert into items_pid_info values (NEW.pid,c) on duplicate key update pidCount = c; 

END&& 


CREATE TRIGGER items_pid_count_upd_trg 
AFTER UPDATE ON items 
FOR EACH ROW BEGIN 

DECLARE c int; 

set c := (select count(*) from items im where im.pid = NEW.pid); 

insert into items_pid_info values (NEW.pid,c) on duplicate key update pidCount = c; 
END&& 


CREATE TRIGGER items_pid_count_del_trg 
AFTER DELETE ON items 
FOR EACH ROW BEGIN 

DECLARE c int; 

set c := (select count(*) from items im where im.pid = OLD.pid); 

insert into items_pid_info values (OLD.pid,c) on duplicate key update pidCount = c; 
END&& 

DELIMITER ; 

希望這有助於。

+0

它幫助了很多,我對mysql非常新,當我使用oracle時,我可以很容易地在同一張桌子上做這件事(例如做一個自動編號),謝謝 – elasticrash