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)を持つレコードが1つだけ残ります。linksetid <> Xのレコードがある場合、2番目のEXISTSチェックケースでは、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では、ターゲットテーブルのサブクエリでupdate/deleteコマンドを使用することはできません。したがって、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 に答える