【发布时间】:2016-08-03 20:21:26
【问题描述】:
我在使用以下设置的数据库表中查找重复项时遇到问题:
==========================================================================
| stock_id | product_id | store_id | stock_qty | updated_at |
==========================================================================
| 9990 | 51 | 1 | 13 | 2014-10-25 16:30:01 |
| 9991 | 90 | 2 | 5 | 2014-10-25 16:30:01 |
| 9992 | 161 | 1 | 3 | 2014-10-25 16:30:01 |
| 9993 | 254 | 1 | 18 | 2014-10-25 16:30:01 |
| 9994 | 284 | 2 | 12 | 2014-10-25 16:30:01 |
| 9995 | 51 | 1 | 11 | 2014-10-25 17:30:02 |
| 9996 | 90 | 2 | 5 | 2014-10-25 17:30:02 |
| 9997 | 161 | 1 | 3 | 2014-10-25 17:30:02 |
| 9998 | 254 | 1 | 16 | 2014-10-25 17:30:02 |
| 9999 | 284 | 2 | 12 | 2014-10-25 17:30:02 |
==========================================================================
每小时都会将库存更新导入此表,我正在尝试查找重复的库存条目(任何具有匹配产品 ID 和商店 ID 的行),以便删除最旧的。下面的查询是我的尝试,通过在这样的连接上比较产品 ID 和商店 ID,我可以找到一组重复项:
SELECT s.`stock_id`, s.`product_id`, s.`store_id`, s.`stock_qty`, s.`updated_at`
FROM `stock` s
INNER JOIN `stock` j ON s.`product_id`=j.`product_id` AND s.`store_id`=j.`store_id`
GROUP BY `stock_id`
HAVING COUNT(*) > 1
ORDER BY s.updated_at DESC, s.product_id ASC, s.store_id ASC, s.stock_id ASC;
虽然此查询有效,但它不会找到所有重复项,只有 1 组,这意味着如果导入出错并且直到早上才被注意到,那么我们可能会留下大量重复项股票条目。遗憾的是,我缺乏 MySQL 技能,我完全不知道如何以快速、可靠的方式查找和删除所有重复项。
欢迎任何帮助或想法。谢谢
【问题讨论】:
-
为什么不将它们设置为复合PK?
-
嗨@jbutler483,很好的问题,我们正在使用的系统有一个需要存在单个主键的ORM。我们真的在 ORM 上以其他方式通过同一系统构建 CRUD 管理。
-
加上数据库将保留最旧的数据,这不是必需的功能:)
-
可能是this describes? 或this 之类的命令
-
@HerbageOnion 我不明白为什么只有一个 PK 很重要——只要你可以在 (product_id,store_id) 上有一个唯一的键约束。那么
INSERT... ON DUPLICATE KEY UPDATE就可以解决问题了
标签: mysql duplicates