我在使用以下设置查找数据库表中的重复项时遇到问题:
==========================================================================
| 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_id
和 store_id
的旧记录,并保留最新记录。
关于mysql - 查找并删除 MySQL 中的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27174535/