【问题标题】:SELECT unique row from field 3 to field 4从字段 3 到字段 4 中选择唯一行
【发布时间】:2011-09-29 14:33:13
【问题描述】:

有没有办法删除基于两个字段的重复记录?

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

event_registrations
• unique_id
• 事件名称
• id(人的身份证号码)
• 姓名

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

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

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

但是一个人可能不会注册他们已经注册的活动:

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

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

任何帮助将不胜感激

【问题讨论】:

  • 您可以通过在 (eventname,personid) 上添加 UNIQUE 约束来禁止它
  • 如何在字段组合中添加一个?
  • 我搞定了,谢谢 ypercube
  • @SebastianOpperman - 另外,如果您已经有一个可以引用的Person 表,那个 表应该包含namesurname 列,并且它应该从event_registrations 表中删除(我建议将id 重新命名为person_id,以使来源显而易见)。哦,您可能应该创建一个 event 表,并为其存储一个外键,而不是名称 - 例如,当有人输入正确的“马拉松”拼写时会发生什么?

标签: php mysql sql database forms


【解决方案1】:

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

然后添加UNIQUE约束:

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

您添加注册的表单应进行相应调整,以处理当重复行被拒绝时从 MySQL 收到的错误。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-09-16
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多