[mySQL] Emailliste findet keine doppelten Einträge

syntec

Lt. Commander
Registriert
Mai 2005
Beiträge
1.057
Ich habe hier eine Liste mit Emailadressen als Datenbank vorliegen. In der Liste sind defintiv doppelte Einträge die ich natürlich gerne entfernen würde - leider gibt es dabei einige Probleme:

Die Struktur ist soweit klar, id mit auto-increment, emailfeld als varchar(50)
PHP:
CREATE TABLE `emailliste` (
  `id` int(11) NOT NULL auto_increment,
  `email` varchar(50) collate latin1_german1_ci NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COLLATE=latin1_german1_ci AUTO_INCREMENT=0 ;

Mit folgender SQL Abfrage sollte er mir ja alle doppelten Einträge anzeigen:

PHP:
 SELECT COUNT( * ) , email
FROM emailliste GROUP
BY email
HAVING COUNT( * ) >1

Es gibt aber 0 Ergebnisse wenn ich das in PHPmyadmin mache. Auch ein einfacher Test funktioniert nicht richtig:

PHP:
SELECT *
FROM `emailliste`
WHERE `email` LIKE CONVERT( _utf8 'test@test.de'
USING latin1 )
COLLATE latin1_german1_ci

Ich habe die Emailadresse "test@test.de" doppelt eingetragen - gefunden wird aber immer nur ein Ergebnis. Suche ich nach LIKE %test% werden beide angezeigt.

Ok, letzter Ausweg:
PHP:
ALTER TABLE `emailliste` ADD UNIQUE (
`email`
)

Solange identische Einträge vorhanden sind, sollte sich mysql ja sperren das Feld unique hinzubekommen. Aber auch das wurde klaglos übernommen obwohl doppelte Einträge vorhanden sind. :mad:

Hat jemand eine Idee was ich noch probieren könnte?
 
Zuletzt bearbeitet:
Versuche es mal so:

PHP:
select *
from emailliste
group by email 
having count (*) >1

So kannst du die doppelten bzw. mehrfach vorkommenden DS einfach löschen:

1. Kommen E-Mail-Adressen mehrmals vor, wird die aktuellste (höchste ID) in eine "temporäre" Tabelle kopiert.
PHP:
select *, max(id) as id
into tmp_email
from emailliste
group by email 
having count (*) >1

2. Alle Datensätze in emailliste deren E-Mail-Adresse und der ID nicht vorkommt in tmp_email, werden in emailliste gelöscht.
PHP:
delete from emailliste 
where id not in 
(select id from tmp_email) 
and email in (select email from tmp_email)

3. tmp_email wird wieder gelöscht.
PHP:
drop table tmp_email
 
Zurück
Oben