2011-10-16 2 views
0

동일한 항목 (중복, 3 중 등등)을 허용하는 표가 있지만 항목이 몇 번이나 그 항목과 함께 업데이트되도록 할 때마다 원하는 항목이 있습니다. 존재합니다. 여러 개의 동일한 항목을 추적

그래서 나는

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

을 수행하여 이미 중복 항목을 찾을 수 트리거를 작성하는 생각하지만, 일이 쿼리가 더 적은 열을 반환한다는 orinal 테이블 (많은 중복이 있습니다 원인)

쿼리와 테이블 사이에 1 대 1의 관계가 없으므로 업데이트를 사용할 수 있습니다. 원하는 결과를 얻으려면 어떻게 수정해야합니까?

고급으로 부탁드립니다. 여기에 직면하게 될

+0

왜 추가 열이 필요합니까? 약간의 정보가 필요할 때 단순히 pid로 카운트를 실행할 수 있습니까? –

+0

수천 개의 항목이 있고 더 많은 항목이 지속적으로 추가되고 다른 항목이 일부 항목을 볼 때 대개 hundend 정도이므로 ... 동일한 쿼리를 hundrends 번 실행할 수 없습니다. 실용적이지 않다. – elasticrash

답변

1

가장 큰 문제는 MySQL은 (이 순환 참조로 이어질 수있는 방법을 생각) 당신이 items 테이블 자체에 대한 수정을 다음 AFTER INSERT ... 트리거를 사용하여 items 테이블을 수정할 수 없다는 것입니다.

한 가지 해결책은 개수를 별도의 표에 모두 저장하는 것입니다 (예 : items_pid_info). 이 테이블의 기본 키는 pid이고 주 항목 테이블의 트리거에 의해 업데이트되는 것이이 테이블입니다. 주어진 pidpidCount에 액세스해야하는 경우이 테이블에 가입하기 만하면 해당 PID에 대한 최신 PID가 있습니다. 따라서이 도움이

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 ; 

희망 :

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

지금 INSERT, UPDATEDELETEitems_pid_info 테이블을 업데이트 items 테이블에 트리거를 만들 수 있습니다.

+0

그것은 많은 도움이되었다. iam은 mysql에 새로운 것이었고, 나는 오라클을 사용할 때 같은 테이블에서 쉽게 할 수 있었다. – elasticrash

관련 문제