経緯
業務でテーブル内の重複データを削除する必要があったために使用したSQLです
データのidが必要だったために使用したSELECT文です
運用等でSQLを考える時の参考になればと思います
実行環境
Mysql 5.6
ここでの重複データとは?
例:tagsテーブル
article_id | title | position |
---|---|---|
1 | rails | 1 |
1 | python | 2 |
2 | ruby | 3 |
1 | rails | 2 |
1 | python | 3 |
3 | ruby | 4 |
- column1(title)の値が同一でcolumn2(position)が異なる値のもの
- 異なる値とはここではpositionが1ずれている
どんなSELECT文?
削除対象がpositionの値が大きい方なので、そちらを取得してます
削除対象を取得するSELECT文
SELECT
t2.id, (t2.position + 1)
FROM
tags t1
INNER JOIN
tags t2
ON
t1.article_id = t2.article_id
WHERE
t1.position = t2.position + 1
AND
t1.title = t2.title
;
Deleteする場合はどんなSQL文?
先程書いたSELECT文で対象のidを取得し、それを元にdeleteしています
取得したidを元に削除するDELETE文
DELETE
FROM
tags
WHERE
id IN (
SELECT id FROM (
SELECT
t1.id
FROM
tags t1
INNER JOIN
tags t2
ON
t1.article_id = t2.article_id
WHERE
t1.position = t2.position + 1
AND
t1.title = t2.title
) AS tmp
)
;
編集履歴
- deleteするSQLがうまく動作しなかったので、変更しました。同じテーブルに対するサブクエリからの操作は出来ない為です