我一路走到互联网的尽头,我被困住了。虽然我可以找到部分答案,但我无法对其进行修改以使其正常工作。
我有一个名为 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')
答案 0 :(得分: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中你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;