MySQLMyISAMテーブルがあります。
テーブルfriends(id、friend_id):
1、5
5、1
2、6
6、2
3、7
リバースレコードを削除する方法は?レコード値«1、5»の場合、値«5、1»のレコードが存在する場合、«5、1»を削除する必要があります。
助けてくれてありがとう!
MySQLMyISAMテーブルがあります。
テーブルfriends(id、friend_id):
1、5
5、1
2、6
6、2
3、7
リバースレコードを削除する方法は?レコード値«1、5»の場合、値«5、1»のレコードが存在する場合、«5、1»を削除する必要があります。
助けてくれてありがとう!
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
結論:
これを試して:
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」ステートメントを修正しました。それをテストしました、うまくいきます。申し訳ありません!
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
)
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)