1

id ではなく列 id_str によって重複した製品を含む製品テーブルがあります。id_str を使用して各製品を追跡します。これは私がこれまで試したことです:

一時テーブルを作成して切り捨て、次のクエリを実行しました

INSERT INTO products_temp SELECT DISTINCT id_str, id, title, url, image_url, long_descr, mp_seller_name, customer_rating, curr_item_price, base_item_price, item_num, rank, created_at, updated_at, published, publish_ready, categories, feed_id, category_names, last_published_at, canonical_url, is_curated, pr_attributes, gender, rating, stock_status, uploadedimage_file_name, updated_by, backfill_text, image_width, image_height, list_source, list_source_time, list_category, list_type, list_image, list_name, list_domain, notes, street_date, list_product_rank, created_by from products

そして、これはすべてを移動しましたが、新しいテーブルで重複する id_str を検索したとき:

SELECT id_str, COUNT(*) C FROM PRODUCTS GROUP BY id_str HAVING C > 1

元のテーブルと同じ結果が得られます。私は何が欠けていますか?

4

4 に答える 4

1

他の列の 1 つ以上により、挿入される行が一意になります。カウントクエリで id_str のみをテストしています。

于 2012-08-27T21:56:44.850 に答える
0

試すSELECT id_str, COUNT(*) C FROM PRODUCTS_TEMP GROUP BY id_str HAVING C > 1

あなたの場合、あなたは元のテーブルから再び選択しています。

于 2012-08-27T22:00:50.983 に答える
0

これは、重複を見つけて削除するために見つけた最も簡単な方法です。

注: InnoDB エンジンのバグのため、これを機能させるには、エンジンを MyISAM に変更する必要があります。

ALTER TABLE <table_name> ENGINE MyISAM

次に、無視を使用して重複を見つけようとしている列に一意のインデックスを追加します。

ALTER IGNORE TABLE <table_name> ADD UNIQUE INDEX(`<column_name>`)

dbエンジンを元に戻します:

ALTER TABLE <table_name> ENGINE InnoDB

必要に応じて、作成したばかりのインデックスを削除できますが、そもそも重複の原因を調べることをお勧めします。

于 2012-09-04T08:41:42.983 に答える
0

onlyを使用SELECT DISTINCTすると、重複した行全体が削除されます。値の 1 つだけが同じで他の値が異なる場合、行は削除されません。

idそれが一意であると仮定して、代わりにこれを試してください:

 INSERT INTO products_temp
 SELECT id_str, id, title, url, -- etc
 FROM products
 WHERE id IN (SELECT MIN(id) FROM products GROUP BY id_str)
于 2012-08-27T21:56:36.947 に答える