我有一个像这样的myqsl图表:PRIMERY KEY(ID),名称,值,日期
如果“Name AND Value AND 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);
答案 0 :(得分:1)
在我看来,你可以做得更简单,就像这样:
$delDups = "delete from chart where id not in (select min(id) from chart n group by value)";
在子查询中,你是saing: “嘿,取所有值并找到值组的最小值”
因此,想象子查询的结果作为列表,如“(12,13,200)”.. NOT IN运算符将采用该列表并使用它来过滤上层查询的结果并说“给”我所有的结果,少于这个列表中的id“
我不确定我是否按预期解释了......
答案 1 :(得分:1)
您可以为所有3列添加唯一键:
ALTER IGNORE TABLE my_table
ADD CONSTRAINT uc_unic UNIQUE (Name, Value, Date)
对于那个x,mysql允许别名,为方便起见,本质上是名称快捷方式。
答案 2 :(得分:0)
您写的内容几乎可以使用,您只想将name
和date
添加到GROUP BY
子句中。这样的事情应该做。
DELETE FROM chart
WHERE id NOT IN (
SELECT MIN(id)
FROM chart
GROUP BY name, value, date)
DELETE FROM
表示您要删除表中的行。 WHERE
子句说明您确实要删除哪些行(错过它将删除所有内容)。括号中的子查询将查看name
,value
和date
的每个组合,并从每个组合中返回一个id
。总而言之,DELETE
现在应该删除id
不是每个组最小的每一行。
希望有所帮助!