【问题标题】:Mysql query for removing rows having duplicate entries用于删除具有重复条目的行的 Mysql 查询
【发布时间】:2018-10-12 08:53:40
【问题描述】:

我想删除所有具有重复条目的行,并且我不想保留每个行。我希望删除所有具有重复条目的条目。在这里,我提到了一些将保持最高或最低 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                                                                                                                                                                                                                                                                                       

【问题讨论】:

标签: php mysql mysqli duplicates


【解决方案1】:

选择不同且最旧的条目(注意: 使用 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)
);

【讨论】:

  • 看最后一张。
【解决方案2】:
DELETE cart.* FROM cart INNER JOIN (SELECT rfid,catagory FROM cart GROUP BY rfid,catagory HAVING COUNT(*)>1) dup ON cart.rfid = dup.rfid AND cart.`catagory` = dup.`catagory`                                                                                                                     

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

【讨论】:

    猜你喜欢
    • 2021-10-23
    • 2021-01-22
    • 1970-01-01
    • 2016-08-30
    • 2015-05-25
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多