Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[SQL] usuwanie duplikatow...

0 views
Skip to first unread message

Tomasz !Blob! Dzierzek

unread,
May 18, 2002, 6:00:03 AM5/18/02
to
Witam!

Proste pytanie: jak usunac duplikaty wiadomosci, z wszystkich tabel MySQL
(albo tylko z jednej), zanczam, ze sa to pol-duplikaty, czyli roznia sie ID,
ktore jest unikalne...

Tomasz Dzierzek


zu

unread,
May 18, 2002, 9:00:44 AM5/18/02
to

"Tomasz !Blob! Dzierzek" <to...@rpg.info.pl> wrote in message
news:ac58is$pmk$1...@news.tpi.pl...

Mozesz sprobowac utworzyc nowa tabele przerzucajac potrzebne wartosci
odpowiednim selectem.

Ewentualnie nie wiem czy nie zadziala cos takiego :
DELETE From Tabela T1
WHERE
(pole1, pole2, ...) IN (SELECT pole1, pole2..
FROM tabela
Where Id <> T1.Id)

ale nie wiem czy w delete mozna uzyc zagniezdzonych selectow itd.
Ogolnie jesli powielaja ci sie dane i roznia sie tylko kluczem to znaczy
ze powinienes lepiej zaprojektowac tabele.

pozdrawiam
Zuzia

Tomasz !Blob! Dzierzek

unread,
May 18, 2002, 5:00:46 PM5/18/02
to
> > Proste pytanie: jak usunac duplikaty wiadomosci, z wszystkich tabel
MySQL
> > (albo tylko z jednej), zanczam, ze sa to pol-duplikaty, czyli roznia sie
> ID,
> > ktore jest unikalne...
> >
> [CHLAST!]

> ale nie wiem czy w delete mozna uzyc zagniezdzonych selectow itd.
> Ogolnie jesli powielaja ci sie dane i roznia sie tylko kluczem to znaczy
> ze powinienes lepiej zaprojektowac tabele.

User mi F5 [refresh] robi przy dodawaniu np. komentarza. I sa double
trouble... :/

Tomasz Dzierżek


Michal Postupalski

unread,
May 19, 2002, 4:14:51 AM5/19/02
to
> > ale nie wiem czy w delete mozna uzyc zagniezdzonych selectow itd.
> > Ogolnie jesli powielaja ci sie dane i roznia sie tylko kluczem to znaczy
> > ze powinienes lepiej zaprojektowac tabele.
>
> User mi F5 [refresh] robi przy dodawaniu np. komentarza. I sa double
> trouble... :/

to znaczy, ze masz zle zaprojektowana aplikacje.

pozdr.
michal


Tomasz !Blob! Dzierzek

unread,
May 19, 2002, 6:26:24 AM5/19/02
to

Super, dziekuje za pomoc.

Tomasz Dzierzek


Michal Postupalski

unread,
May 19, 2002, 2:05:55 PM5/19/02
to
> > to znaczy, ze masz zle zaprojektowana aplikacje.
>
> Super, dziekuje za pomoc.

Gdybys pomyslal o usunieciu przyczyny a nie jej efektow i opisalbys jak ten
Twoj algorytm do dodawania komentarzy dziala, to bys uzyskal dokladniejsza
odpowiedz.

pozdr.
michal


Tomasz !Blob! Dzierzek

unread,
May 20, 2002, 9:29:47 AM5/20/02
to
> > Super, dziekuje za pomoc.
>
> Gdybys pomyslal o usunieciu przyczyny a nie jej efektow i opisalbys jak
ten
> Twoj algorytm do dodawania komentarzy dziala, to bys uzyskal dokladniejsza
> odpowiedz.

Juz nawet w tym momencie nie chodzi o mechanizm dodawania, ale o to, ze mam
stare bazy, w ktorych mam duplikaty. Recznie nie bede przeciez wywalal....
tabela zawiera pare rzeczy z ktorymi mozna cos zrobic :: ID (unikalne), DATA
(unix timestamp, przy duplikatach zawsze taka sama), no i inne szczegoliki
niewazne (temat, itp.).

!Blob!


Michal Postupalski

unread,
May 20, 2002, 5:24:18 PM5/20/02
to
> Juz nawet w tym momencie nie chodzi o mechanizm dodawania, ale o to, ze
mam
> stare bazy, w ktorych mam duplikaty. Recznie nie bede przeciez wywalal....
> tabela zawiera pare rzeczy z ktorymi mozna cos zrobic :: ID (unikalne),
DATA
> (unix timestamp, przy duplikatach zawsze taka sama), no i inne szczegoliki
> niewazne (temat, itp.).

najprosciej to mozna zrobic chyba tak:
zalozenie:
- ID jest zawsze unikalne
- pozostale pola moga sie roznic lub sa wszystkie identyczne w przypadku
duplikatow
- mozna zmienic ID kazdego z wpisow i nie wplynie to na integralnosc bazy
danych ani calej aplikacji

rozwiazanie problemu:
1. wrzucasz do nowej, tymczasowej tabeli wszystkie unikalne wiersze, ze
starej, (opsuzczasz pole ID)
INSERT INTO tabela_czasowa (pole1, pole2, pole3 .....) SELECT
DISTINCT pole1, pole2, pole3..... FROM twoja_tabela;
2. czyscisz stara tabele
TRUNCATE TABLE twoja_tabela;
3. wrzucasz z powrotem dane do twojej_tabeli z tabeli tymczasowej
INSERT INTO twoja_tabela (pole1, pole2, pole3 .....) SELECT pole1,
pole2, pole3..... FROM tabela_czasowa;

nie jestem tego na 100% pewien, bo nigdy sie w takie rzeczy nie bawilem i
niech mnie ktos poprawi, jesli sie myle.

pozdr.
michal


Henry

unread,
May 21, 2002, 10:43:50 AM5/21/02
to
Użytkownik Tomasz !Blob! Dzierzek <to...@rpg.info.pl> w wiadomości do grup dyskusyjnych
napisał:ac58is$pmk$1...@news.tpi.pl...

A moze tak wystarczy?

DELETE FROM tab
WHERE (id, a,b,c) in (SELECT max(id), a,b,c FROM tab GROUP BY a,b,c)

Pozdrawiam,
Henry


Lucyna Witkowska

unread,
May 22, 2002, 2:28:10 AM5/22/02
to
Henry <hf...@poczta.fm> wrote:
>> Proste pytanie: jak usunac duplikaty wiadomosci, z wszystkich tabel MySQL
>> (albo tylko z jednej), zanczam, ze sa to pol-duplikaty, czyli roznia sie ID,
>> ktore jest unikalne...

> A moze tak wystarczy?

> DELETE FROM tab
> WHERE (id, a,b,c) in (SELECT max(id), a,b,c FROM tab GROUP BY a,b,c)

Chyba NOT IN.
Pozdrowienia,
LW

Henry

unread,
May 23, 2002, 7:31:32 AM5/23/02
to
Użytkownik Lucyna Witkowska <ypwi...@nospamcyf-kr.edu.pl> w wiadomości do grup dyskusyjnych
napisał:acfdpq$asc$1...@info.cyf-kr.edu.pl...

Masz racje jesli duplikatow jest wiecej niz 2 to lepiej dac NOT IN i Min(id) zamiast
Max(id) (zeby zostawial pierwszy rekord)

Pozdrawiam,
Henry


0 new messages