MySQL
SQL

重複しているレコードを削除するSQL

経緯

業務でテーブル内の重複データを削除する必要があったために使用した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
  )
;

編集履歴

  1. deleteするSQLがうまく動作しなかったので、変更しました。同じテーブルに対するサブクエリからの操作は出来ない為です

参考サイト

MySQLでERROR:1093を回避する