MySQL:根据最大值删除记录

时间:2016-03-05 00:23:37

标签: mysql

我有一个包含两个外键的表。我需要删除key1和amp;的所有行。 key2是相同的,但是val< $ X

key1& key2不是不同的值;可以有多个具有相同key1和/或key1 / key2对的记录。

我已经尝试了几种方法,但无法获得任何工作。到目前为止,每种方法都会导致MySQL错误(例如“无法重新打开表”)或错误的结果。

表中的示例数据:

rownum  key1    key2    val    col    col2    col3    col4
1       123     1       2      a      b       c       d
2       123     1       2      e      f       g       h
3       123     2       3      i      j       k       l
4       123     2       3      m      n       o       p 
5       456     1       1      q      r       s       t

我需要删除“val”为<任何给定的key1 / key2对的最高“val”。

换句话说,对于每个不同的key1 / key2组合,我需要找到max“val”($ x),并删除val所在的任何行< $ X

因此,delete语句后的所需输出是:

rownum  key1    key2    val    col    col2    col3    col4
3       123     2       3      i      j       k       l
4       123     2       3      m      n       o       p
5       456     1       1      q      r       s       t    

(col-col4与确定要删除的记录无关,我只包括它们以注意该表包含其他列。)

key1,key2和“val”都是int类型。

如何删除key1&的行? key2是相同的,但是val< $ X?

2 个答案:

答案 0 :(得分:2)

使用多表删除语法,使用关键字段在表中连接表:

DELETE t1 FROM table1 t1, table1 t2
WHERE t1.key1=t2.key1 AND t1.key2=t2.key2 AND t1.val < t2.val

Sqlfiddle - 我修改了样本数据,使其具有不同的密钥对值。

答案 1 :(得分:1)

我不确定你的主键是什么,所以我只是称之为primary_key

首先,我们需要为每个key1找到key2的最大值

SELECT key1 as fk1, max(key2) as max_key2 from table group by key1

然后key2&lt; max_key2

SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1

然后删除那些行

DELETE from table where primary_key in (SELECT id from (SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1))

我没有对此进行测试,但这大致是我将如何解决这个问题。

不用说,但在删除和备份之前验证