【问题标题】:delete "duplicate" entries and keep latest one删除“重复”条目并保留最新条目
【发布时间】:2018-11-20 04:10:37
【问题描述】:

我忘记在我的表中添加唯一索引(process_id、result_id):

id, created_at, process_id, result_id, value
1, 2018-11-01, 1, 1, a
2, 2018-11-03, 1, 1, b
3, 2018-11-05, 2, 4, c

现在,对于 process_id 和 result_id 的相同组合,我有多个条目。

为了添加唯一索引,我需要删除重复项,只保留每个进程/结果对的最新条目 (created_at)。

如何轻松识别和删除较旧的重复项?

我可以识别所有重复项:

select pr.id, pr.created_at, prd.* 
from process_results pr
join (
    select process_id, result_id
    from process_results 
    group by process_id, result_id
    having count(*) > 1
) prd on pr.request_id = prd.request_id and pr.request_filter_id = prd.request_filter_id

但我不知道如何删除除最新的以外的所有内容

预期结果:

id, created_at, process_id, result_id, value
2, 2018-11-03, 1, 1, b
3, 2018-11-05, 2, 4, c

【问题讨论】:

标签: mysql


【解决方案1】:
DELETE t1 
FROM yourTable t1
INNER JOIN yourTable t2 
ON
    t1.created_at < t2.created_at 
AND t1.process_id = t2.process_id 
AND t1.result_id = t2.result_id    
;

识别是一样的

SELECT t1.*
FROM yourTable t1
INNER JOIN yourTable t2 
ON
    t1.created_at < t2.created_at 
AND t1.process_id = t2.process_id 
AND t1.result_id = t2.result_id

【讨论】:

  • 您使用 WHERE 而不是 ON 有什么原因吗?
  • @Uueerdo 不是。我只是从一个例子中复制粘贴。两种方式都一样
  • 发生了什么克里斯,我认为您将其作为正确答案进行了检查,但随后将其删除?没有解决你的问题?
【解决方案2】:
DELETE bad_rows.* FROM process_results AS bad_rows
                   INNER JOIN (
                      SELECT created_at,value,min(`process_id`) AS min_id FROM process_results GROUP BY process_id,result_id HAVING COUNT(*) > 1
                   ) AS good_rows ON good_rows.value = bad_rows.value AND good_rows.min_id != bad_rows.id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多