2011-09-29 38 views
0

有沒有辦法根據兩個字段刪除重複的記錄?從字段3到字段4選擇唯一的行

我有一個系統,人們可以註冊體育賽事。在表中:

event_registrations
•UNIQUE_ID
•事件名稱
•ID(個人的身份證號碼)
•姓名

一個人都可以申請很多事件 - ID可重複 事件可能有多個參與者 - eventname可能重複:

--Johnsmith-- --Mountain Cycle-- 
--Johnsmith-- --Marathnon Walk-- 

--Linda--  --Mountain Cycle-- 
--Johnsmith-- --Mountain Cycle-- 

但是一個人可能不會t註冊他們已經註冊的活動:

--Johnsmith-- --Mountain Cycle-- 
--Johnsmith-- --Mountain Cycle-- 

他們通過表單選擇活動名稱。然後表格數據及其用戶詳細信息存儲在表event_registrations中。

任何幫助,將不勝感激

+3

你可以禁止通過在'(事件名稱,PERSONID)' –

+0

如何添加一個字段的組合加入'UNIQUE'約束? – SebastianOpperman

+0

我得到了它的工作謝謝ypercube – SebastianOpperman

回答

2

先刪除重複的(eventname, id)組合任何行。

然後加入特殊約束:

ALTER TABLE yourTable 
    ADD CONSTRAINT eventname_person_Unique 
    UNIQUE INDEX eventname_id_U 
     (eventname, id) ; 

你的形式,增加了登記應相應調整治療錯誤,否則它將從MySQL時得到重複行被拒絕。正如ypercube所暗示的,防止這種情況的方法是

0

A UNIQUE INDEX。如果你需要收拾添加唯一約束之前,做一些數據,那麼你可以使用,爲什麼總是有一個唯一的ID列如下(一個很好的理由

SELECT 
    eventname, 
    id -- You should consider using a less ambiguous name here 
FROM 
    Event_Registrations ER1 
WHERE 
    EXISTS (
     SELECT * 
     FROM Event_Registrations ER2 
     WHERE 
      ER2.eventname = ER1.eventname AND 
      ER2.id = ER1.id AND 
      (ER2.registration_datetime < ER1.registration_datetime OR 
       (ER2.registration_datetime = ER1.registration_datetime AND 
       ER2.unique_id < ER1.unique_id 
       ) 
      ) 
    ) 
0

:要識別/刪除現有的重複,你可以使用這個一個好主意):

create table id_for_deletion (id int unsigned not null); 

insert into id_for_deletion (id) 
( 
select a.delete_me_id 
from (
select eventname,id,max(unique_id) as delete_me_id 
from event_registrations 
group by eventname,id 
having count(*) > 1 
) a); 



delete from event_registrations where unique_id in (select id from id_for_deletion); 

drop table id_for_deletion;