Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][SQL] Jak usunąć zdublowane rekordy w bazie ?
Klycior
post
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


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ęść.

(IMG:http://img153.imageshack.us/img153/8303/dubelc.jpg)


Z góry dziękuję.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 19)
tehaha
post
Post #2





Grupa: Zarejestrowani
Postów: 1 748
Pomógł: 388
Dołączył: 21.08.2009
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


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


Ten post edytował tehaha 2.01.2011, 19:29:51
Go to the top of the page
+Quote Post
wookieb
post
Post #3





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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ł.
Go to the top of the page
+Quote Post
Klycior
post
Post #4





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


Czyli najlepiej teraz będzie dodać do tabeli ID do każdego "wpisu" tak ?

A jak tego dokonać ?

Go to the top of the page
+Quote Post
wookieb
post
Post #5





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dodaj pole id z właściwością "auto_increment". Rekordu ponumerują się same i będziesz mógł kombinować.
Go to the top of the page
+Quote Post
sazian
post
Post #6





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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ć

Ten post edytował sazian 2.01.2011, 19:42:06
Go to the top of the page
+Quote Post
wookieb
post
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Klycior
post
Post #8





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #9





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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!

Ten post edytował wookieb 2.01.2011, 20:25:46
Go to the top of the page
+Quote Post
sazian
post
Post #10





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


ale tu nie ma ID (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
wookieb
post
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Naprawdę? To zupełnie tak samo jak z twoim procesem przeczytania tematu (IMG:style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post
Klycior
post
Post #12





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


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


(IMG:http://www.bankfotek.pl/image/846786.jpeg)



Zgadza się?
Go to the top of the page
+Quote Post
Wicepsik
post
Post #13





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


  1. DELETE FROM tabela WHERE id > 17169
  2.  
  3. DELETE FROM tabela WHERE id > 8


Nie ma różnicy
Go to the top of the page
+Quote Post
wookieb
post
Post #14





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.
Go to the top of the page
+Quote Post
Klycior
post
Post #15





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


6.5MB

Chcę dla wszystkich jednocześnie czyli 8, tak ?
Go to the top of the page
+Quote Post
wookieb
post
Post #16





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 2.01.2011, 20:53:37
Go to the top of the page
+Quote Post
Klycior
post
Post #17





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
wookieb
post
Post #18





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Klycior
post
Post #19





Grupa: Zarejestrowani
Postów: 116
Pomógł: 2
Dołączył: 31.05.2009

Ostrzeżenie: (0%)
-----


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ć (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sazian
post
Post #20





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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`
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 15:27