1

我有一个产品表,其中包含列 id_str 而不是 id 的重复产品。我们使用 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

一个或多个其他列导致插入的行是唯一的。您只是在计数查询中测试 id_str。

于 2012-08-27T21:56:44.850 回答
0

仅使用SELECT DISTINCT会删除重复的整行。如果只有一个值相同而其他值不同,它不会删除一行。

假设这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 回答
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

然后在使用忽略时向您尝试查找 dup 的列添加唯一索引:

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

并将您的数据库引擎改回来:

ALTER TABLE <table_name> ENGINE InnoDB

如果你愿意,你可以删除你刚刚创建的索引,但我建议你首先调查一下导致重复的原因。

于 2012-09-04T08:41:42.983 回答