Archívum december 2009

 
 

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.