用于删除具有重复条目的行的Mysql查询

时间:2018-05-02 09:34:49

标签: php mysql mysqli duplicates

我想删除所有具有重复条目的行,我不想保留每个条目中的单个条目。我希望删除所有条目重复的条目。在这里,我提到了一些代码,它们将保持最高或最低的id值。此处的所有查询将保留来自重复记录的单个条目

Mysql我试过的查询是

DELETE * ,count(*)as n FROM cart by rfid HAVING n>1

数据库设计:

ID(PK)|RFID    |CATAGORY                                                       
1     |1       |5                                                                                           
2     | 1      | 5                                                                                        
3     | 2      | 4                                                                                       
4     |3       | 6                                                                                                           

输出:

ID(PK)|RFID|CATAGORY                                                                       
2     | 1      | 5                                                                                        
3     | 2      | 4                                                                                       
4     |3       | 6                                                                                                           

预期结果:

ID(PK)|RFID|CATAGORY                                                               
 3     | 2      | 4                                                                                        
 4     |3       | 6                                                                                                                                                                                                                                                                                       

2 个答案:

答案 0 :(得分:0)

选择不同的和最旧的条目(注意:使用MIN()并假设id是自动增量模式和PK),只需切换到MAX()以保留最新值。

SELECT MIN(id) FROM cart group by rfid;

全部一起(删除以前选择中没有的所有内容

DELETE FROM cart where id NOT in (SELECT MIN(id) FROM cart group by rfid);

上面不会起作用,因为你不能在FROM子句中指定更新的目标表(在这种情况下是DELETE),但你可以通过子选择进行操作,因此最终的工作查询将是:

DELETE FROM cart WHERE id NOT IN (SELECT MIN(A.id) FROM (SELECT * FROM cart) A group by A.rfid);

修改(删除所有计数> 1的条目)

DELETE FROM cart WHERE id  IN( 
  SELECT A.id FROM (SELECT * FROM cart) A where A.rfid IN 
  (SELECT B.rfid from  (SELECT * FROM cart) B group by B.rfid having count(B.rfid)>1)
);

答案 1 :(得分:0)

ServiceActivator

此查询解决了我的问题。谢谢你