削除時に、削除対象テーブルと「重複行を取得するサブクエリ」を結合することにより実現可能かと思います。
以下、サンプルコードです。
■物理削除の場合
`
DELETE
sample_table
FROM
sample_table
INNER JOIN
(
SELECT
title,
name,
user_id,
MIN(id) AS min_id,
COUNT()
FROM
sample_table
GROUP BY
title,
name,
user_id
HAVING
COUNT() > 1
) AS DUPLICATION -- 重複行を取得するサブクエリ
ON
sample_table.title = DUPLICATION.title
AND
sample_table.name = DUPLICATION.name
AND
sample_table.user_id = DUPLICATION.user_id
AND
sample_table.id <> DUPLICATION.min_id -- 重複行のうち、idが最小のものを削除対象から除外する(別の行を残したい場合は、この条件を適宜修正してください)
`
■論理削除の場合(削除フラグを更新)
`
UPDATE
sample_table
INNER JOIN
(
SELECT
title,
name,
user_id,
MIN(id) AS min_id,
COUNT()
FROM
sample_table
GROUP BY
title,
name,
user_id
HAVING
COUNT() > 1
) AS DUPLICATION -- 重複行を取得するサブクエリ
ON
sample_table.title = DUPLICATION.title
AND
sample_table.name = DUPLICATION.name
AND
sample_table.user_id = DUPLICATION.user_id
AND
sample_table.id <> DUPLICATION.min_id -- 重複行のうち、idが最小のものを削除対象から除外する(別の行を残したい場合は、この条件を適宜修正してください)
SET
sample_table.delete_flag = 1
`
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/07/31 00:57
2014/07/31 05:06