mysql - 查找并删除 MySQL 中的重复行

标签 mysql duplicates

我在使用以下设置查找数据库表中的重复项时遇到问题:

==========================================================================
| 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;

虽然这个查询可以工作,但它不会找到所有重复项,只找到一组,这意味着如果导入出错并且直到早上才注意到,我们可能会留下大量重复项股票条目。遗憾的是,我的 MySQL 技能很匮乏,而且我完全不知道如何以快速、可靠的方式查找和删除所有重复项。

欢迎任何帮助或想法。谢谢

最佳答案

您可以使用此查询:

DELETE st FROM stock st, stock st2 
WHERE st.stock_id < st2.stock_id AND st.product_id = st2.product_id AND 
st.store_id = st2.store_id;

此查询将删除具有相同 product_idstore_id 的旧记录,并保留最新记录。

关于mysql - 查找并删除 MySQL 中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174535/

相关文章:

mysql - Perl 数据库连接在 .pm 文件中不起作用

sql - 在 SQL Server 2008 中使用 select where 查找一列上的重复项

mysql选择重复的field_value更新结果中的另一个字段

python - 如何通过查询向mysql表中添加新列

.htaccess - 是否可以使用htaccess中的此模式的规范URL:/a/*/id/uniqueid?

c - 为什么这个循环每次循环打印相同的值?

java - 无法在 Hibernate 中检索带有负 double 的实体

c# - 在 Visual Studio 2010 中的 C# Windows 应用程序中使用 mysql

php - 从动态二维数组创建多级菜单

php - 迁移 : Cannot add foreign key constraint in Laravel 6