Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Usuwanie dublowanych email z MySQL.
Forum PHP.pl > Forum > Przedszkole
Giluś
Cześć, mam bazę MySQL gdzie jest ~2k użytkowników i chciałbym teraz sprawdzić czy któreś się powtarzają np.:

ID|Email|name|hash
1|ddd@o2.pl|ddd|dddd
2|ddd@o2.pl|cos|cos2
3|ddd2@o2.pl|cos|cos2
4|ddd@o2.pl|cos|cos2
.....
400|cos2@gmail.pl|222|553
753|cos2@gmail.pl|111|333


I teraz widzimy, że ID o numerze 1, 2, 4 oraz 400 i 753 się powtórzyły (takie sam email) jak teraz wykonać aby przeskanować wszystkie wyniki z mysql i te które się powtórzyły usunąć, te powtórzenia nie muszą być tak blisko siebie, mogą być o ID=1 a drugi o ID=224..


Na ogół stworzenie pętli oraz usuwanie wyników z mysql potrafię, ale nie wiem jak zrobić to z tym czy jakieś wyniki się powtórzyły..


Pozdrawiam i z góry bardzo dziękuje.
mortus
Trochę bez sensu, że e-mail nie jest unikalny. Zapytanie:
  1. SELECT `Email`, GROUP_CONCAT(`ID` SEPARATOR ',') `ids` FROM `tabela` GROUP BY `Email` HAVING COUNT(`ID`) > 1

wybierze Ci adresy e-mail, które się powtarzają oraz wszystkie identyfikatory dla tych adresów oddzielone przecinkiem. Pozostaje jedynie pytanie, które wiersze z tych wybranych mają być usunięte.

EDIT:
Mała zmiana.
adek-
Spróbuj tego wrzucając poprzez zapytanie SQL w phpMyAdminie - oczywiście zrób kopię bazy w razie czego, aczkolwiek wpis działa na 100%

będzie sprawdzał zduplikowane rekordy Email i zostawi ten który jest o najmniejszym ID, oczywiście jeśli chcesz po czymś innym sprawdzać to też nie ma problemu.
  1. DELETE n1 FROM twojaNazwaBazy n1, twojaNazwaBazy n2 WHERE n1.ID > n2.ID AND n1.Email= n2.Email


ewentualnie jeśli chcesz aby sprawdzał dwa warunki, czyli gdy będzie użytkownik o tym samym name i Email taki w obu rekordach to dodaj tylko jeszcze jeden AND na końcu
  1. AND n1.name= n2.name


i dodaj sobie wartość unique na któryś z rekordów, nie będą się tworzyły takie same wpisy..
Giluś
Zrobiłem coś takiego:

  1. $wynik = mysql_query("SELECT email FROM portal_user group by email having count(*) > 1") or die('Błąd: '.mysql_error());
  2.  
  3. $i = 1;
  4. while($r = mysql_fetch_assoc($wynik)) {
  5. echo ''.$i++.' - '.$r['email'].'<br /><hr>';
  6. }


I pokazało mi ~400 rekordów, to są te rekordy które się powtarzają tak ?
mortus
Nie, to są adresy e-mail, które się powtarzają. Identyfikatory rekordów zyskasz dodając do zapytania GROUP_CONCAT, jak wyżej pisałem.
Giluś
Dobra, dobra poradziłem sobie. wink.gif

Dzięki bardzo.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.