【问题标题】:How do I delete records in MySQL and keep the lastest date如何删除 MySQL 中的记录并保持最新日期
【发布时间】:2011-07-19 16:52:23
【问题描述】:

例如table_1

ID Email         Answer   UpdateDate
1  xxx.@xx.com   1        2011-07-02
2  xxx.@xx.com   3        2011-07-11
3  vvv.@xx.com   3        2011-07-12
4  vvv.@xx.com   5        2011-07-13
5  xxx.@xx.com   5        2011-07-14
6  xxx.@xx.com   4        2011-07-14
7  xxx.@xx.com   4        2011-07-14
8  zzz.@xx.com   4        2011-07-15

如何删除这些记录但保留最新的UpdateDate

结果:

ID Email         Answer   UpdateDate
4  vvv.@xx.com   5        2011-07-13
7  xxx.@xx.com   4        2011-07-14
8  zzz.@xx.com   4        2011-07-15

【问题讨论】:

  • 好吧,就 ID 而言,这个结果是不正确的; ID 并不意味着改变。结果中的 ID 应为 54
  • Delan Azabani 感谢提供 ID。已编辑
  • 您能否更具体地说明您想要保留的内容?它只是最近的日期吗?每个电子邮件地址的最新信息?每个答案值的最新值?还是别的什么?
  • @Steve Claridge 我想删除所有重复的Email 地址,但根据最新的UpdateDate 只保留一个。

标签: mysql sql


【解决方案1】:

我会根据相关的子查询检查 UpdateDate。

CREATE TEMPORARY TABLE
  latestRecord (
    Email        VARCHAR(128),
    updateDate   DATETIME
) 
INSERT INTO 
  latestRecord
SELECT
  Email,
  MAX(updateDate) AS updateDate
FROM
  table_1
GROUP BY
  Emal

DELETE 
  table_1
FROM
  table_1
INNER JOIN
  latestRecord
    ON  latestRecord.Email      = table_1.Email
    AND latestRecord.updateDate < table_1.updateDate

编辑

相同逻辑的另一个重构

【讨论】:

  • 错过了顶行的“FROM”。
  • 您不能在 FROM 子句中指定目标表 'table_1' 进行更新
  • 另一个使用临时表的重构。显然 MySQL 没有要删除或更新的表,也不能在子查询中使用。
【解决方案2】:

您可以使用一个临时变量来存储最高日期,然后使用单独的查询来删除所有小于该日期的内容。请记住,变量是特定于连接的。

select max(UpdateDate) from table_1 into @TempUpdateDate

delete from table_1 where UpdateDate < @TempUpdateDate

【讨论】:

  • 谢谢史蒂夫。这个正在工作,但有些数据会在不保留最新日期的情况下删除。
  • 这仍然具有与其他答案相同的逻辑错误。每个电子邮件地址都需要保存 那个 电子邮件地址的最新记录。由于每个电子邮件地址的最后一个电子邮件地址的日期不同,因此您不能使用临时变量。
【解决方案3】:

确保 UpdateDate 是一个 DATETIME 字段。

您想为每个答案值保留最新的 UpdateDate 吗?这样做:

delete from table_1 where UpdateDate not in ( select max(UpdateDate) from table_1 group by Answer );

如果您只想保留最新日期,那么:

delete from table_1 where UpdateDate not in ( select max(UpdateDate) from table_1 );

【讨论】:

  • 谢谢史蒂夫。我得到了 1093 - 您不能在 FROM 子句中指定目标表 'table_1' 进行更新
  • 他想要每个用户的最新答案(电子邮件地址)。 NOT IN 的使用在这里不起作用,因为每个用户只能保留一个日期,并且用户之间可能会有所不同。 (我也会看看这个语法问题。)
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多