Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][SQL] Jak usunąć zdublowane rekordy w bazie ?
Forum PHP.pl > Forum > Przedszkole
Klycior
Cześć,

Podczas zmiany hostingu okazało się że w jednej bazie wszystkie dane zostały zdublowane.
Całość bazy się podwoiła co daje mi teraz 3 te same pola przez co strasznie obciąża mi procesy z użytkownika.
Jak mogę teraz efektywnie usunąć wszystkie zdublowane wpisy tak aby został jeden.

Czyli patrząc niżej na screen, dojść do takiego rozwiązania które usunie zakreśloną część.




Z góry dziękuję.
tehaha
grupujesz rekordy na wszystkich kolumnach i je zliczasz funkcją COUNT() i stosując klauzulę HAVING pobierasz te id, które są zdublowane a potem drugim zapytaniem je usuniesz
  1. SELECT COUNT(id) AS num FROM nazwa_tabeli GROUP BY nick, ip, sid, inne_kolumny HAVING num > 1
wookieb
Tylko, że ten tutaj pan nie zastosował unikalnego klucza głównego (czytaj ID). Nie będzie to takie proste jak się wydaje.
Ja bym po prostu dodał klucz główny i na nim manewrował.
Klycior
Czyli najlepiej teraz będzie dodać do tabeli ID do każdego "wpisu" tak ?

A jak tego dokonać ?

wookieb
Dodaj pole id z właściwością "auto_increment". Rekordu ponumerują się same i będziesz mógł kombinować.
sazian
a gdyby dać select into + distinct i przepisać dane do innej tabeli, a następnie zrobić podmiankę tabel
nie mam pewności czy zadziała ale myślę że warto spróbować
wookieb
Mnie się wydaje, że import wykonał się parę razy. Jeżeli tak to wtedy wystarczy znaleźć pierwsze id, które jest ostatnim właściwym rekordem i usunąć wszystkie wyższe.
Przykład

rekord - 1
rekord - 2
rekord - 3
duplikat rekordu - 4
duplikat rekordu - 5
itd

Wystarczy wtedy zrobić
  1. DELETE FROM tabela WHERE id > 3

I po kłopocie.
Klycior
wookieb, napewno się tak stało.
Tylko nie rozumiem tego polecenia:

  1. DELETE FROM tabela WHERE id > 3


Przecież to polecenie usunie mi wszystkie rekordy w których ID jest wyższe niż 3, a nie o to mi chodzi.
wookieb
No właśnie. Czyli wszystkie zduplikowane (spójrz na przykład jaki podałem). Oczywiście pod 3 musisz wstawić odpowiednie id (spójrz na przykład). Tylko zrób wszystkie backupy!
sazian
ale tu nie ma ID winksmiley.jpg
wookieb
Naprawdę? To zupełnie tak samo jak z twoim procesem przeczytania tematu snitch.gif
Klycior
No ID już dodałem.

wookieb, czyli patrząc na screen wychodzi że mam coś takiego użyć:

  1. DELETE FROM tabela WHERE id > 17170






Zgadza się?
Wicepsik
  1. DELETE FROM tabela WHERE id > 17169
  2.  
  3. DELETE FROM tabela WHERE id > 8


Nie ma różnicy
wookieb
Nie. Większe od 8 (ponieważ on jest ostatnim unikalnym rekordem). Ale... usuwasz duplikaty tylko dla użytkownika "brajan" ? Myślałem, że chcesz to zrobić dla wszystkich rekordów na raz a w takim wypadku liczba 8 nie będzie prawidłowa.
Dużą masz tą tabelę? Możesz ją gdzieś wrzucić to Ci przerobimy.
Klycior
6.5MB

Chcę dla wszystkich jednocześnie czyli 8, tak ?
wookieb
Wystaw gdzieś dumpa (struktura + dane) z tabeli bo się nie dogadamy.
Jeżeli chcesz robić dla wszystkich to przy usuwaniu rekordów o id większym niż 8 raczej na pewno usuniesz prawidłowe rekordy (bo zostanie Ci tylko 8 rekordów brajana). Wróć proszę do kursu MySQL bo wydaje mi się, że nie masz pojęcia co robisz.
Klycior
wookieb, a spojrzałeś na drugiego screena jakiego dodałem ?

Przecież kiedy wpiszę twoje polecenie to usunie mi wszystkie ID większe od 8 czyli wszystkich pozostałych użytkowników a zostawi mi samego brajana, a nie o to nam chodzi.
Po backupie rekordy powtarzają się od ID 17169 więc też dlaczego mam wpisać ID 8 ?
Jak już wcześniej napisałem kiedy bym dał:

  1. DELETE FROM tabela WHERE id > 17169


To uzyskał bym taki efekt że właśnie usunie mi wszystkich użytkowników od ID większym niż 17169 czyli same duble...

Jeżeli ja źle to rozumiem to widocznie jeszcze żyję nowym rokiem.
wookieb
Patrzałem. Jeżeli jesteś pewien że 17170 jest pierwszym zduplikowanym rekordem to twoje zapytanie będzie prawidłowe.
W pewnym sensie ja też się zamieszałem także przepraszam smile.gif
Klycior
No tak z tego wynika, bo skoro dodałem pole ID a użytkownik Brajan ma ID 1-8 a następnie od 17170-17178 to wychodz ina to że od takiego ID powtarzają się duble. Zaraz sprawdzę i dam znać smile.gif
sazian
wróćmy do mojego sposobu - który działa, sprawdziłem
  1. CREATE TABLE `Backup_tabela` LIKE tabela;

  1. INSERT INTO `Backup_tabela` SELECT DISTINCT * FROM tabela GROUP BY `nick`,`ip`,`sid`,`klasa`,`lvl`,`exp`,`str`,`int`,`dex`,`agi`

teraz wywalasz wszytko z tabeli
  1. DELETE FROM tabela

i przepisujesz unikalne dane
  1. INSERT INTO `tabela` SELECT * `Backup_tabela`
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.