0

我有一个这样的MySQL图表表:PRIMARY KEY(ID), Name, Value, Date

如果“名称、值和日期”与现有行相同,我需要删除重复项。我有一个我之前找到的解决方案并且有效(不是100%),但我不明白其中的命令,因为我只使用 BASIC MySQL ......有人可以进一步解释我......

肯定最后的x是什么???

$delDups = "delete from chart where id not in (select * from (select min(id) from chart n group by value) x)";

mysql_query($delDups);
4

3 回答 3

1

在我看来,你可以做的更简单,像这样:

$delDups = "delete from chart where id not in (select min(id) from chart n group by value)";

在子查询中,您正在说:“嘿,取所有值并找到值组的最小 id”

因此,将子查询的结果想象为一个列表,例如“(12,13,200)”.. NOT IN 运算符将获取该列表并使用它来过滤上层查询的结果并说“给我所有结果,减去 id 在此列表中的结果”

我不确定我是否按预期解释...

于 2013-09-29T20:48:36.787 回答
1

您可以为所有 3 列添加唯一键:

ALTER IGNORE TABLE my_table
ADD CONSTRAINT uc_unic UNIQUE (Name, Value, Date)

至于那个 x,mysql 允许别名,为了方便起见,本质上是命名快捷方式。

于 2013-09-29T20:50:04.327 回答
0

你写的几乎可以工作,你只想在子句中添加nameand 。这样的事情应该做。dateGROUP BY

DELETE FROM chart
WHERE id NOT IN (
  SELECT MIN(id)
  FROM chart
  GROUP BY name, value, date)

DELETE FROM表示您要从表中删除行。该WHERE子句说明您实际要删除哪些行(错过它会删除所有内容)。括号中的子查询将查看 , 的每个组合namevalue并从每个组合中返回一个dateid综上所述,DELETE现在应该删除id不是每个组中最小的每一行。

希望有帮助!

于 2013-09-29T20:51:22.453 回答