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
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
User mi F5 [refresh] robi przy dodawaniu np. komentarza. I sa double
trouble... :/
Tomasz Dzierżek
to znaczy, ze masz zle zaprojektowana aplikacje.
pozdr.
michal
Super, dziekuje za pomoc.
Tomasz Dzierzek
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
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!
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
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
> 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
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