我一路走到了互联网的尽头,我真的被困住了。虽然我可以找到部分的答案,但我无法修改它使之生效。
我有一个名为myfetcher的表,比如:

+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| fid_id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| linksetid   | varchar(200) | NO   |     | NULL    |                |
| url         | varchar(200) | NO   |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+

url字段有时会包含重复项,但不是删除表中的所有重复项,我只需要在字段linksetid等于X的情况下使用。
下面的SQL将删除表中的所有重复项(这不是我想要的)。。。但我想要的只是字段linksetid中设置范围内的重复项。我知道我做错了什么,只是不知道是什么。
DELETE FROM myfetcher USING myfetcher, myfetcher as vtable
WHERE (myfetcher.fid>vtable.fid)
  AND (myfetcher.url=vtable.url)
  AND (myfetcher.linksetid='$linkuniq')

最佳答案

只删除linksetid=X的记录。首先存在检查用例当所有记录都是linksetid=X时,则只剩下一个min(fid)。当存在linksetid为X的记录时,则将删除linksetid为X的所有记录:
注意:此查询在Oracle或MSSQL中有效。对于MYSql,请使用下一个解决方法:

DELETE FROM myfetcher
where (myfetcher.linksetid='$linkuniq')
      and
      (
      exists
      (select t.fid from myfetcher t where
                 t.fid<myfetcher.fid
                 and
                 t.url=myfetcher.url
                 and
                 t.linksetid='$linkuniq')

      or

      exists
      (select t.fid from myfetcher t where
                 t.url=myfetcher.url
                 and
                 t.linksetid<>'$linkuniq')
       )

在MYSql中,您can't use update/delete command with subquery for the target table。所以对于MySql,可以使用以下脚本。SqlFiddle demo
create table to_delete_tmp as
select fid from myfetcher as tmain
     where (tmain.linksetid='$linkuniq')
      and
      (
      exists
      (select t.fid from myfetcher t where
                 t.fid<tmain.fid
                 and
                 t.url=tmain.url
                 and
                 t.linksetid='$linkuniq')

      or

      exists
      (select t.fid from myfetcher t where
                 t.url=tmain.url
                 and
                 t.linksetid<>'$linkuniq')
       ) ;

delete from myfetcher where myfetcher.fid in (select fid from to_delete_tmp);

drop table to_delete_tmp;

10-05 20:30