Mysql duplicate rows

Egy project alkalmával szembesültem a címben említett problémával. Adott volt egy adatbázis tábla melyben voltak duplikált sorok. A feladat ezeknek a soroknak a törlése volt. Első gondolatom egy temporary table megoldás volt, miszerint csinálok egy temp táblát abba egy selectel distinct -el a duplikációt jelző mezőn átrakom a recordokat és utána az eredeti táblát törlöm, a temp-et pedig átnevezem az eredeti nevére:

CREATE TABLE temp AS SELECT * FROM table1 GROUP BY FIELD;
DROP TABLE table1;
RENAME TABLE temp TO  table1;

Ez a megoldás teljesen jól működik és elvégzi a kivánt feladatot, de ha php-ból szeretnénk megvalósítani akkor ez három lekérdezés lesz, mert a multiple query az általában tiltva van. Ezért elkezdtem keresni egy elegánsabb megoldást és találtam is.
A dolog lényege hogy a táblánakt kétszer is használjuk a queryben egy alias-sal:

DELETE FROM table1
USING table1, table1 AS temp_table
WHERE (table1.id> temp_table.id)
AND (table1.FIELD=temp_table.FIELD)

A fenti lekérdezés megnézi hogy a két táblában (ami tulajdonképpen ugyanaz csak más néven) vannak olyan rekordok ahol a duplikált mező egyezik, viszont az azonosító nem(mert ha ez is akkor mindkét sort törölnénk), és törli ezeket.


Cimkék:

 
 
 

2 válasz nak “Mysql duplicate rows”

  1. wram
    5. március 2010 04:31

    Épp most került nálam elő ez a probléma.
    Köszi ezt az “egyszerű” megoldást!

  2. Greg Molnar
    5. március 2010 04:54

    annyit tapasztaltam ezzel a post megírása óta, hogy a második megoldás sok rekordnál egy lassú query lesz. így hosszútávon én az elsőt használom, mert igaz hogy három lekérdezés, de még így is gyorsabb.

Szólj hozzá!

Comment Spam Protection by WP-SpamFree