软件网站建设公司微信朋友圈推广软文
这是mysql删除重复数据,且保留两条数据的sql,但这条语句含有一个危险的问题,如果子查询到的数据为空,会将表test的数据全部删除。
sql
DELETE
FROMtest
WHEREid NOT IN (SELECTid FROM(SELECTid FROMtest WHEREid IN (SELECTid FROM( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a UNIONSELECTid FROM( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b )) c )
思路
设置一个条件,这条件必须满足子查询有数据。
解决
在删除语句后,增加子查询有数据的结果大于0。
sql代码
AND (SELECTcount(*) FROM(SELECTid FROMtest WHEREid IN (SELECTid FROM( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a UNIONSELECTid FROM( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b )) c ) > 0;
完整代码
DELETE
FROMtest
WHEREid NOT IN (SELECTid FROM(SELECTid FROMtest WHEREid IN (SELECTid FROM( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a UNIONSELECTid FROM( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b )) c ) AND (SELECTcount(*) FROM(SELECTid FROMtest WHEREid IN (SELECTid FROM( SELECT min( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) a UNIONSELECTid FROM( SELECT max( id ) id FROM `test` GROUP BY fd, fe HAVING count( id ) > 2 ORDER BY id ) b )) c ) > 0;