我得到了一張表,我允許相同的條目(重複,三重等),但我也有一個列,我希望每次都有一個條目進行更新的次數多少次存在。跟蹤多個相同的條目
所以我想編寫一個觸發器,我已經可以找到重複的條目做
select count(pid) from items group by pid having count(*);
但事情是,這個查詢返回較少列的orinal表(原因有很多重複)
所以查詢和表之間沒有1對1的關係,所以我可以使用更新。我怎麼修改這個來得到想要的結果
謝謝高級。
我得到了一張表,我允許相同的條目(重複,三重等),但我也有一個列,我希望每次都有一個條目進行更新的次數多少次存在。跟蹤多個相同的條目
所以我想編寫一個觸發器,我已經可以找到重複的條目做
select count(pid) from items group by pid having count(*);
但事情是,這個查詢返回較少列的orinal表(原因有很多重複)
所以查詢和表之間沒有1對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);
現在創建INSERT
,UPDATE
和DELETE
觸發對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 ;
希望這有助於。
它幫助了很多,我對mysql非常新,當我使用oracle時,我可以很容易地在同一張桌子上做這件事(例如做一個自動編號),謝謝 – elasticrash
爲什麼你需要額外的列?當你需要那些信息時,你能不能通過pid運行計數? –
因爲有成千上萬的條目和越來越多的連續添加,當有人查看一些條目通常是一個人或...所以我不能運行相同的查詢hundrends時間。它不太實用 – elasticrash