[Db] problema interessante sql

Marcello Vezzelli marcello a vezz.it
Ven 6 Apr 2007 11:56:25 CEST


Ciao a tutti,
ho una rubrica che contiene indirizzi email e un riferimento all'utente 
proprietario del contatto.
La rubrica dell'utente 1 quindi è fatta così:

(id,email,rif_utente,descrizione)
1,email a email.it,1,prova1
2,cucu a ciao.it,1,prova2
3,zio a budda.net,1,prova3
4,zio a budda.net,1,prova3bis
ecc.

Siccome devo mettere un indice univoco su rif_utente ed email (gli 
utenti d'ora in poi non possono inserire contatti email duplicati), 
dovrei trovare i contatti duplicati per tutti gli utenti: ci sono utenti 
che hanno inserito più volte la stessa email con descrizione diversa 
(era possibile e desiderato dall'architettura precedente per una serie 
di motivi che non ha senso riportare qui)

Con questa query mi elenco i contatti doppi e i loro proprietari.

SELECT count(id) as zk,rif_utente,email FROM `contatti` group by 
rif_utente,email having zk>1

Ora quello che vorrei fare è eliminare i contatti doppi, quindi se una 
mail è inserita 3 volte in uno stesso utente, cancellare le ultime 2 
copie e tenere la prima.

Con una query di questo tipo riesco ad ottenere i contatti dal secondo 
in poi.

SELECT * FROM `contatti` WHERE rif_utente=1 and email='zio a budda.net' 
limit 1,100

Ora i contatti doppi (nel mondo reale del database che devo modificare) 
sono pochi, quindi potrei benissimo farlo "a mano".
Però mi sembrava un problema interessante, e volevo sentire opinioni da 
qualcuno più esperto su un approccio per andare fino in fondo alla 
questione.

Qualche suggerimento?

Saluti
Marcello





Maggiori informazioni sulla lista Db