考虑下表
id || C1 || C2 || C3 || Timestamp
--------------------------------
1 || a || b || 1 || t1
2 || a || b || 1 || t2
3 || a || b || 2 || t3
4 || a || b || 2 || t4
5 || a || b || 2 || t5
6 || b || d || 3 || t6
7 || b || d || 3 || t7
C3 包含给定的 C1 和 C2 组合的不同值。 C1、C2 和 C3 的给定组合可以包含具有不同时间戳的多行(如行 4,5)。
但是,重复会导致为给定的 C1 和 C2 对创建多个 C3。因此,这里第 3、4 和 5 行违反了规则,因为引入了新的 C3(2)。给定 C1 和 C2,C3 始终是唯一的。
我想保留 C1、C2、C3 的最新(带时间戳)组合并删除所有旧的组合。因此仅应存在第 3,4,5 行,并应删除第 1,2 行。
我所说的“最新”是指应删除给定 C1、C2 的旧 C3 值,因此在本例中,第 1,2 行被删除,但第 3、4、5 行保留。
例如,给定唯一的 nid 和原始列,所有带有mock_id YR 的行都应该被删除。
我尝试了各种查询和联接,但无法找出可以解决这个问题的方法。
最佳答案
我们可以尝试在这里使用存在逻辑:
DELETE
FROM yourTable t1
WHERE EXISTS (SELECT 1 FROM yourTable t2
WHERE t2.C1 = t1.C1 AND t2.C2 = t1.C2 AND t2.C3 > t1.C3);
用简单的英语来说,此查询表示删除任何我们可以找到具有相同 C1
的记录。和C2
值,但更大 C3
值(value)。如果存在这样的另一条记录,则意味着当前正在检查的记录不是最新的,应删除。
关于mysql - SQL查询删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59152257/