5

MySQLMyISAMテーブルがあります。

テーブルfriends(id、friend_id):

1、5

5、1

2、6

6、2

3、7

リバースレコードを削除する方法は?レコード値«1、5»の場合、値«5、1»のレコードが存在する場合、«5、1»を削除する必要があります。

助けてくれてありがとう!

4

4 に答える 4

7
DELETE F1
FROM friends F1, friends F2
WHERE F1.friend_id = F2.id
  AND F2.friend_id = F1.id
  AND F1.id > F1.friend_id

編集

もう少し良い構文は次のようになります。

DELETE F1
FROM friends F1
  JOIN friends F2 ON F1.friend_id = F2.id AND F2.friend_id = F1.id
WHERE F1.id > F1.friend_id

ただし、実行時間は同じです。

同様に、私はこの小さなスクリプトを作成して、迅速で汚いベンチマークを作成しました。

結果:

インデックスなし:

Dalen:600=>400行。時間:0.0274
マーク:600=>400行。時間:0.4323
冷ややか:600=>400行。時間:0.4081
ニック:600=>400行。時間:0.3201

id列とfriend_id:の個別のインデックス

Dalen:600=>400行。時間:0.0201
マーク:600=>400行。時間:0.0095
冷ややか:600=>400行。時間:0.0059
ニック:600=>400行。時間:0.3257

の一意のインデックス(id, friend_id)

Dalen:600=>400行。時間:0.0168
マーク:600=>400行。時間:0.0057
冷ややか:600=>400行。時間:0.0041
ニック:600=>400行。時間:0.3209

結論:

  • Dalen:列にインデックスが付けられていない場合に最速
  • Frosty:列にインデックスが付けられている場合に最速(Markが近くにあり、tmpテーブルの作成時間を考慮しない場合はさらに高速になります。ただし、フィールドにインデックスが付けられると、tmpテーブルの作成に必要な追加時間が増加します)
于 2011-03-25T22:53:03.080 に答える
3

これを試して:

create temporary table tmp    
  select a.* from friends as a,friends as b 
  where a.id = b.friend_id 
    and a.friend_id = b.id    /* left out of original post */
    and a.id < b.id;

delete from friends using friends inner join tmp 
   on friends.id = tmp.id
  and friends.friend_id=tmp.friend_id;

フレンズテーブルが非常に大きい場合、結合は他のアプローチよりも効率的です。

編集:上記の「create...select」ステートメントを修正しました。それをテストしました、うまくいきます。申し訳ありません!

于 2011-03-25T22:53:31.393 に答える
2
DELETE FROM friends
WHERE (id,friend_id) IN
(   
   SELECT * FROM
   (
      SELECT t1.id,t1.friend_id
      FROM friends t1 JOIN friends t2
         ON t1.id=t2.friend_id AND t1.friend_id = t2.id
      WHERE t1.id > t1.friend_id
   ) t3
)
于 2011-03-25T22:43:23.817 に答える
1
create table friends (
id int,
friend_id int ) engine = myisam;

insert into friends values (1,5),(5,1),(2,6),(6,2),(3,7);


delete from friends where (id,friend_id) in
(select * from (
select id,friend_id from friends
union all
select friend_id,id from friends ) as t
where id > friend_id
group by id,friend_id
having count(*) >  1)
于 2011-03-25T22:46:32.267 に答える