2011-09-29 4 views
0

Existe-t-il un moyen de supprimer des enregistrements en double en fonction de deux champs?SÉLECTIONNER une ligne unique du champ 3 au champ 4

J'ai un système où les gens peuvent s'inscrire à des événements sportifs. Dans le tableau:

incription_evenements
• id_unique
• eventName
• id (numéro d'identification de la personne)
• Nom et prénom

Une personne peut demander beaucoup d'événements - id peut dupliquer un événement peut avoir plusieurs participants - le nom de l'événement peut être dupliqué:

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

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

Mais une personne ne peut pas t vous inscrire à un événement, ils se sont déjà inscrits:

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

Ils Sélectionnez un nom d'événement par le biais d'un formulaire. Ensuite, les données de formulaire et leurs détails utilisateur sont stockés dans table event_registrations.

Toute aide serait appréciée

+3

Vous pouvez interdire qu'en ajoutant une contrainte '' UNIQUE' sur (eventName, personid) ' –

+0

comment puis-je ajouter un à la combinaison du champ? – SebastianOpperman

+0

Je l'ai travail merci ypercube – SebastianOpperman

Répondre

2

d'abord supprimer toutes les lignes en double avec (eventname, id) combinaisons.

Ensuite, ajoutez la contrainte UNIQUE:

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

Votre formulaire ajoute les enregistrements doivent être ajustés en conséquence pour traiter l'erreur, il obtiendra de MySQL est rejeté quand une ligne en double.

0

A UNIQUE INDEX est la façon d'éviter cela, comme ypercube suggère. Identifier/supprimer les doublons existants, vous pouvez utiliser ceci:

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

Si vous devez faire des données bien rangé avant d'ajouter la contrainte unique, vous pouvez utiliser les éléments suivants (une bonne raison d'avoir toujours une colonne d'identification unique est une bonne idée):

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; 
Questions connexes