【问题标题】:MySql query to delete duplicate rows by keeping latest timestamp value?MySql 查询通过保留最新的时间戳值来删除重复的行?
【发布时间】:2013-06-14 05:15:51
【问题描述】:

我遇到了关于 mysql 表更新的问题。我的表包含 5 列,包括 ID、NAME、TIMESTAMP 和其他 2 列。我的问题是我想删除那些 ID 和 NAME 都与另一行匹配的行,s ID 和 NAME 保持最新的 TIMESTAMP 行。

我正在尝试以下查询,但它显示错误:

#1093 - 您不能在 FROM 子句中指定目标表 'dummy1' 进行更新

查询是:

delete from dummy1  where LAST_USED_DATE not in(
select max(LAST_USED_DATE) from dummy1
group by ID,NAME);

【问题讨论】:

  • +1 但请在询问有关 sql 查询的任何问题之前使用 sql fiddle。
  • 你想在一个查询中完成吗?

标签: php mysql timestamp sql-delete


【解决方案1】:

试试

DELETE d
  FROM dummy1 d JOIN 
(
  SELECT d1.id, d1.name, MAX(d1.last_used_date) max_date
    FROM dummy1 d1 JOIN dummy1 d2
      ON d1.id = d2.id AND d1.name = d2.name
   GROUP BY id, name
) q ON d.id = q.id AND d.name = q.name AND d.last_used_date <> q.max_date

这里是SQLFiddle演示

更新要仅检查重复的 id,您可以稍微调整上述查询

DELETE d
  FROM dummy1 d JOIN 
(
  SELECT d1.id, MAX(d1.last_used_date) max_date
    FROM dummy1 d1 JOIN dummy1 d2
      ON d1.id = d2.id
   GROUP BY id
) q ON d.id = q.id AND d.last_used_date <> q.max_date

这里是SQLFiddle演示

UPDATE2删除具有最大时间戳的重复项

1) 您可以通过使用 IGNORE 选项引入唯一索引。在这种情况下,MySql 将自行决定保留哪些记录。

ALTER TABLE dummy1 ENGINE MyISAM;
ALTER IGNORE TABLE dummy1 ADD UNIQUE (id, name);
ALTER TABLE dummy1 ENGINE InnoDB;

【讨论】:

  • 你能帮我写另一个查询吗,但我只想检查 ID 值而不是 ID 和 NAME 字段(保持最新的 TIMESTAMP 行的条件相同)
  • @peterm +1 您的查询很好理解,但可视化此类查询似乎有点困难。有没有这样的工具可以查看sql查询的图形化视图?
  • @KalpataruMallick 查看仅检查重复 ID 的查询的更新答案。
  • @Vivek 不幸的是我不知道任何这样的工具。
  • @peterm 还有一个问题是,如果有不止一行具有最大时间戳值,那么查询会保留所有行,但我只想保留那些重复行中的一行。请帮忙
【解决方案2】:

即使没有小提琴,我也会试一试。试试这个:

DELETE D1.* FROM DUMMY1 D1
JOIN (SELECT D.ID,D.NAME, MAX(LAST_USED_DATE) DATE FROM DUMMY1 D GROUP BY D.ID) D2 ON D1.ID = D2.D2
WHERE D1.NAME = D2.NAME AND D1.LAST_USED_DATE <> D2.DATE

我得到相反的结果,因为你保留了MAX(LAST_USED_DATE)

【讨论】:

  • 不幸的是,该查询将删除 id 和 name 匹配的所有条目。
猜你喜欢
  • 1970-01-01
  • 2021-10-25
  • 1970-01-01
  • 2022-01-16
  • 2018-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 2021-11-16
相关资源
最近更新 更多