2

次のようなMySQLテーブルがあります:
(unique_id、uid_data1、uid_data2、sorting_data1、sorting_data2)

このテーブルは、これまで双方向のリレーションがサポートされていなかったツールで使用されるため、テーブルには
(1, 1212, 2034, 1, 1)
(2, 2034, 1212, 1, 1)
(3, 4567, 9876, 1, 0)
(4, 9876, 4567, 0, 1)

テーブルには「一方向」の関係も含まれます。つまり、
(5, 5566, 8899, 1, 9)
=> (?, 8899, 5566, 9, 1) の行は存在しません

ツールが双方向/対称関係をサポートするようになったので、mysql テーブルから重複データを削除したいと思いますが、これを行うための適切なクエリを見つけるのに苦労しています。
上記の例では、uid が 2 と 4 の行を削除したいと思います (データは既に行 1 と 3 に格納されているため)。

最初に、どのエントリが削除されるかを確認するために SELECT ステートメントをセットアップしようとしました。
私はJOINクエリを考えました

SELECT x.uid, x.uid_link1, x.uid_link2, y.uid_link1 as 'uid_link2', y.uid_link2 as 'uid_link1'
FROM tx_sdfilmbase_hilfstab x
INNER JOIN tx_sdfilmbase_hilfstab y ON x.uid_link1=y.uid_link2 AND x.uid_link2=y.uid_link1
WHERE ???
ORDER BY x.uid_link1, x.uid_link2

ただし、MySQL にレコードの「半分」のみを選択するように指示する必要があるところに行き詰まっています。
これを行う方法に関する提案はありますか?

PSテーブルには数千行が含まれているため、テーブル内の各レコードを手動で削除することはできません;-)

4

2 に答える 2

4
Select t.* from MyTable t
inner join MyTable tt
On t.uid_data1 = tt.uid_data2 and t.uid_data2 = tt.uid_data1 and t.unique_ID > tt.unique_ID

ペアの「2番目」の部分を見つける必要があります(例ではレコード2と4)

私がそれを正しく理解した場合

Delete t from MyTable t
inner join MyTable tt
On t.uid_data1 = tt.uid_data2 and t.uid_data2 = tt.uid_data1 and t.unique_ID > tt.unique_ID

仕事をするべきです

于 2012-09-22T19:55:21.283 に答える
1

したがって、1行は

uid_link1=1,uid_link2=9

そしてもう一つ

uid_link1=9 および uid_link2=1

右?

どうですか

.. WHERE x.uid_link1 < y.uid_link1 ...

ただし、これは uid_link1=uid_link2 の重複を削除しません

編集: または使用できます ... WHERE x.unique_id < y.unique_id

于 2012-09-22T19:44:39.223 に答える