【发布时间】:2013-10-09 10:04:17
【问题描述】:
id_specific_price id_product
-------------------------------
1 2
2 2
3 2
4 3
5 3
6 3
7 3
需要删除重复的,预期的结果:
id_specific_price id_product
-------------------------------
3 2
7 3
SELECT *
FROM ps_specific_price
WHERE id_specific_price NOT IN
(SELECT MAX(id_specific_price)
FROM ps_specific_price
GROUP BY id_product)
有效但
DELETE FROM ps_specific_price
WHERE id_specific_price NOT IN
(SELECT MAX(id_specific_price)
FROM ps_specific_price
GROUP BY id_product)
没有。有很多例子可以解决这个问题,但由于某种原因我无法适应它。我相信它是 GROUP BY。例如:
DELETE FROM ps_specific_price
WHERE id_specific_price NOT IN
(SELECT MAX(p.id_specific_price)
FROM (SELECT * FROM ps_specific_price ) as p)
GROUP BY id_product
我哪里出错了?
【问题讨论】:
-
您不应在子查询中使用要删除的表。您应该使用带有游标的存储过程来归档此目标。
-
存储过程是魔鬼的杰作。如果它不能在 SQL 中解决(它可能可以,但可能是特定于供应商的),我建议在应用程序级别(从 Java 或 PHP 等)进行 - 选择 ...;从...中删除 id_specific_price in (...)
-
@CedricSimon Quoi?您的建议(可能)仅对 mysql 有效,它不喜欢在同一语句中读取已删除或更新的表。 (除非阅读参考做了一些聚合,IIRC)
-
这些不是重复的行,您正在删除基于比这更微妙的东西。您要求从按第二个 id 列分组的集合中删除除一行(一列中具有最高 id 的行)之外的所有行。
标签: mysql sql duplicates