sql删除除2个重复之外的所有内容

时间:2012-02-01 20:15:46

标签: mysql sql duplicates sql-delete

我希望能够将mySQL数据库表中重复记录的数量限制为2。

(不包括自动增量的id字段)

我的表格设置为

id    city      item
---------------------
1     Miami     4
2     Detroit   5
3     Miami     4
4     Miami     18
5     Miami     4

因此在该表中,只删除第5行。

我该怎么做?

5 个答案:

答案 0 :(得分:3)

MySQL在读取和写入同一个表时有一些缺陷。所以我实际上并不知道这是否可行,SQL的许多实现中的语法都很好,但我不知道它是否对MySQL友好...

DELETE
  yourTable
WHERE
  1 < (SELECT COUNT(*)
       FROM yourTable as Lookup
       WHERE city = yourTable.city AND item = yourTable.item AND id < yourTable.id)

修改

令人惊讶的复杂,但值得一试?

DELETE
  yourTable
FROM
  yourTable
INNER JOIN
(
  SELECT
    id
  FROM
  (
    SELECT
      id
    FROM
      yourTable
    WHERE
      1 < (SELECT COUNT(*)
           FROM yourTable as Lookup
           WHERE city = yourTable.city AND item = yourTable.item AND id < yourTable.id)
  )
    AS inner_deletes
)
  AS deletes
    ON deletes.id = yourTable.id

答案 1 :(得分:1)

我认为你的问题是你的代码和/或表结构都允许插入重复项,而你应该在真正修复数据库和/或代码时提出这个问题。

答案 2 :(得分:0)

我认为更好的解决方案是避免允许超过5个寄存器,你必须实现验证,如果选择count(*)&gt; 3你不会接受新的插页。

因为如果要在数据层中执行此操作,则必须使用存储过程,因为首先需要识别具有3个以上寄存器的所有寄存器,并仅删除最后一个寄存器。 Saludos

答案 3 :(得分:0)

由于MySQL在更新查询表时非常困难(例如参见Dems的答案),我能想到的最好的不仅仅是一个语句,而且在正面看起来相当可读;

CREATE TEMPORARY TABLE Dump AS SELECT id FROM table1 WHERE id NOT IN 
  (SELECT MIN(id) FROM table1 GROUP BY city,item UNION
   SELECT MAX(id) FROM table1 GROUP BY city,item);

DELETE FROM table1 where id in (select * from Dump);

DROP TABLE DUMP;

不确定删除哪个副本是否重要,这会保留第一个和最后一个。

答案 4 :(得分:0)

在回答Joachim的回答时,你会问到保存3行或5行,这是实现它的一种方法。根据您使用此数据库的方式,您可以在循环中调用它,也可以将其转换为存储过程。无论哪种方式,您都将继续运行整个代码块,直到Rows Affected = 0:

drop table if exists TempTable;
create table TempTable
select city, item,
       count(*) as record_count, 
       min(id) as ItemToDrop -- this could be changed to max() if you 
                             -- want to delete new stuff instead 
from YourTable
group by city, item
having count(*) > 2; -- This value = number of rows you save

delete from YourTable
where id in (select ItemToDrop from TempTable);