2011-09-29 80 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;