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


SELECT unique row from field 3 to field 4

是否有方法删除基于两个字段的重复记录?

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

event_registrations
•unique_id
•eventname
•id(个人身份证号)
•姓名

一个人可以申请多个活动- id可能会重复一个事件可以有多个参与者- eventname可以重复:

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

但是一个人不能注册他已经注册的事件:

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

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

如有任何帮助,不胜感激

首先删除所有具有重复(eventname, id)组合的行。

然后添加UNIQUE约束:

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

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

UNIQUE INDEX是防止这种情况的方法,正如supercube所建议的那样。要识别/删除已存在的重复项,您可以使用:

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

如果您需要在添加唯一约束之前做一些数据整理,那么您可以使用以下(一个很好的理由,为什么总是有一个唯一的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;