1

我一直到互联网的尽头,我被卡住了。虽然我可以找到部分答案,但我无法对其进行修改以使其正常工作。

我有一个名为的表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')
4

1 回答 1

2

仅删除 linksetid=X 的记录。当所有记录都带有 linksetid=X 时,第一个 EXISTS 检查用例,然后只剩下一个带有 min(fid) 的记录。第二个 EXISTS 检查用例,当有一条带有 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 中,您不能将更新/删除命令与目标表的子查询一起使用。因此,对于 MySql,您可以使用以下脚本。SqlFiddle 演示

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;
于 2012-08-23T14:29:45.057 回答