ここ数日、特定のフィールドに基づいて重複行を見つける適切な方法を研究してきました。もう少し助けが必要だと思います -
SELECT *
FROM enrollees
INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b
ON enrollees.first_name = b.first_name
AND enrollees.last_name = b.last_name
AND enrollees.address1 = b.address1
AND enrollees.city = b.city
AND enrollees.state = b.state
AND enrollees.zip = b.zip
AND count > 1
AND enrollees.program_instance_id = b.program_instance_id
AND enrollees.id != MinId;
目標は、重複を取得してアーカイブ テーブル (enrollees_duplicates) に配置し、ライブ テーブル (enrollees) から重複を削除することです。重複する行を見つけて挿入するクエリを 1 つ作成しようとしましたが、次のエラーが発生します。
「列数が行 1 の値数と一致しません」
私が使ってみたクエリは次のとおりです。
INSERT INTO enrollees_duplicates (SELECT *
FROM enrollees
INNER JOIN (SELECT first_name, last_name, address1, city, state, zip, program_instance_id, MIN(id) AS MinId, COUNT(id) AS count FROM enrollees GROUP BY first_name, last_name, address1, city, state, zip, program_instance_id) b
ON enrollees.first_name = b.first_name
AND enrollees.last_name = b.last_name
AND enrollees.address1 = b.address1
AND enrollees.city = b.city
AND enrollees.state = b.state
AND enrollees.zip = b.zip
AND count > 1
AND enrollees.program_instance_id = b.program_instance_id
AND enrollees.id != MinId);
INNER JOIN 選択ですべての列を取得していないためだと思いますか? その場合、新しいテーブルには存在しない余分な列が 2 つあるため、(MinId と count を追加して) SELECT * に変更しても同じエラーがスローされませんか?
重複を SELECT し、それらを PHP 配列に格納し、別の SQL クエリを使用して各行をプルし、それを重複テーブルに挿入し、次に別のSQLを使用することなく、SQL クエリですべての作業を行う方法はありますか?重複行を削除するクエリ。
私の意図は、2 つのクエリを使用することでした。1 つはすべての重複行をアーカイブ テーブルに挿入し、もう 1 つは重複行を削除します。どういうわけか、重複を見つけてアーカイブテーブルに挿入し、それらを削除する1つのクエリにすることができれば、それはさらに良いでしょう.
この分野は初めてなので、ヘルプやガイダンスをいただければ幸いです。