私はテーブルを持っています:
+------------+------------------------------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+------------------------------------------------------+------+-----+---------+-------+
| person_id1 | int(10) | NO | MUL | 0 | |
| person_id2 | int(10) | NO | MUL | 0 | |
| priority | smallint(5) | NO | | 0 | |
| link_type | enum('member_of_band','legal_name','performs_as','') | NO | | | |
+------------+------------------------------------------------------+------+-----+---------+-------+
このテーブルには主キーはありませんが、person_id1 と person_id2 にはインデックスがあります。
問題は、次のクエリのように一貫性のないデータがあることです。
SELECT
COUNT(*) as c, person_id1, person_id2
FROM person_person
WHERE link_type = "member_of_band"
GROUP BY person_id1, person_id2
HAVING c > 1
LIMIT 10;
戻り値:
+---+------------+------------+
| c | person_id1 | person_id2 |
+---+------------+------------+
| 2 | 50674235 | 51048792 |
| 3 | 50674245 | 50715733 |
| 2 | 50674283 | 50712621 |
| 2 | 50674322 | 50714244 |
| 2 | 50674378 | 51048804 |
| 2 | 50674438 | 51048812 |
| 4 | 50674442 | 50715733 |
| 2 | 50674449 | 50716913 |
| 2 | 50674455 | 51048803 |
| 3 | 50674469 | 50715733 |
+---+------------+------------+
冗長なレコードをすべて削除し、問題のないレコードを残す方法はありますか?
私が思いついたのは次のとおりです。
DELETE person_person FROM person_person
WHERE (person_id1, person_id2) IN (
SELECT
person_id1, person_id2
FROM person_person
WHERE link_type = "member_of_band"
GROUP BY person_id1, person_id2
HAVING COUNT(*) > 1
LIMIT 100
) AND link_type = "member_of_band";
しかし、それは double を持つすべてのレコードを削除するので、double だけを削除する必要があります。
mysql> select * from person_person where person_id1 = 50674245 and person_id2 = 50715733;
+------------+------------+----------+----------------+
| person_id1 | person_id2 | priority | link_type |
+------------+------------+----------+----------------+
| 50674245 | 50715733 | 0 | member_of_band |
| 50674245 | 50715733 | 0 | member_of_band |
| 50674245 | 50715733 | 0 | member_of_band |
+------------+------------+----------+----------------+