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: mysql

5. március 2010 04:31
Épp most került nálam elő ez a probléma.
Köszi ezt az “egyszerű” megoldást!
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.