选择从字段3到字段4的唯一行

时间:2011-09-29 14:33:14

标签: php mysql sql database forms

有没有办法根据两个字段删除重复记录?

我有一个人们可以注册体育赛事的系统。在表格中:

event_registrations
•unique_id
•eventname
•id(人的身份证号码)
•姓名和姓氏
一个人可以申请许多活动 - 身份证可以复制 一个事件可能有多个参与者 - 事件名可能重复:

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

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

但是,某人可能无法注册他们已注册的活动:

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

他们通过表单选择一个事件名称。然后,表单数据及其用户详细信息存储在表event_registrations中。

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

首先删除任何包含重复(eventname, id)组合的行。

然后添加UNIQUE约束:

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

应该相应调整添加注册的表单,以便在重复行被拒绝时处理从MySQL获得的错误。

答案 1 :(得分:0)

正如ypercube建议的那样,UNIQUE INDEX是防止这种情况发生的方法。要识别/删除现有的重复项,您可以使用:

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
                )
            )
    )

答案 2 :(得分:0)

如果你需要在添加唯一约束之前做一些数据整理,那么你可以使用以下(一个很好的理由,为什么总是有一个唯一的id列是个好主意):

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;