2016-03-05 91 views
3

我有一个包含两个外键的表。我需要删除key1的所有行,其中key2是key2,但val < $ x。MySQL:根据最大值删除记录

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”为<最高的“VAL”对于任何给定KEY1/KEY2对。

换句话说,对于每个不同的key1/key2组合,我需要找到最大值“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?

+0

向我们展示您尝试过的查询。 –

+2

对于'key1 = 123'和'key2 = 2'的组合,val的最高值为3.因此,在两种情况下'key2'小于3,那么为什么组合不会被删除? –

+0

对不起,该文章(现已编辑)出现错误。我的意思是说: “我需要删除'val'对于任何给定的key1/key2对'最高'val'的所有行。” – fournines

回答

1

我不知道你的主键是什么,所以我只是把它称为primary_key

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

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

然后所有行其中KEY2 < 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)) 

我还没有测试过这个,但这大概是我如何去解决这个问题。

这不用说,但验证您删除并具有备份

2

之前,使用一个多表删除您使用的重点领域加入表上本身的语法:

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

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