从“MySQL”中删除重复项并保留单个记录

时间:2011-12-09 18:53:55

标签: mysql

我使用以下查询来查找重复记录并验证它是否正确运行。

SELECT MLS_LISTING_ID, STREET_NUMBER, STREET_NAME, UNIT_NUMBER, MLS_ID, SALE_PRICE, ZIP_CODE, TLN_REALTOR_ID, COUNT(mls_id)
FROM idx_FM_BO_NA
GROUP BY TLN_REALTOR_ID, STREET_NUMBER, STREET_NAME, UNIT_NUMBER, SALE_PRICE
HAVING COUNT(distinct MLS_ID) > 1; 

如何更改此查询以删除重复项,以便只有一个记录实例?我不担心哪些记录被删除,但我需要其中一个留下来。

3 个答案:

答案 0 :(得分:2)

我认为这个答案是正确的:

delete from table1 USING table1, table1 as vtable 
WHERE table1.ID<vtable.ID AND table1.field_name=vtable.field_name

这一点与paulsm4的答案之间的唯一区别在于使用less-than而不是not-equals来比较id。这样,以后不会与之前的记录进行比较(这意味着将保留一个且仅保留一个相同的记录)。我用自己需要的数据测试了这个,并且它有效。

答案 1 :(得分:0)

这是一个简单的解决方案:

  

http://www.cyberciti.biz/faq/howto-removing-eliminating-duplicates-from-a-mysql-table/

delete from table1 USING table1, table1 as vtable 
WHERE (NOT table1.ID=vtable.ID) AND (table1.field_name=vtable.field_name)
  
      
  1. 在这里告诉mysql有一个table1。
  2.   
  3. 然后你告诉它你将使用table1和一个值为table1的虚拟表。
  4.   
  5. 这会让mysql不能将记录与自身进行比较!
  6.   
  7. 在此告诉它不应该有相同field_name的记录。
  8.   

答案 2 :(得分:0)

  

以下MySQL命令将创建一个临时表和   用一个列名称(列)填充所有列GROUPED   具有重复的)并按主键升序排序。该   第二个命令从临时表创建一个真实的表。该   第三个命令删除正在使用的表,最后删除最后一个表   command将第二个临时表重命名为当前使用的当前表   表名。

这是一个非常快速的解决方案 以下是四个命令:

  1. CREATE TEMPORARY TABLE videos_temp AS SELECT * FROM videos GROUP by title ORDER BY videoid ASC;
  2. CREATE TABLE videos_temp2 AS SELECT * FROM videos_temp;
  3. DROP TABLE videos;
  4. ALTER TABLE videos_temp2 RENAME videos;