Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL:根据最大值删除记录_Mysql - Fatal编程技术网

MySQL:根据最大值删除记录

MySQL:根据最大值删除记录,mysql,Mysql,我有一张包含两个外键的桌子。我需要删除key1和key2相同但val

我有一张包含两个外键的桌子。我需要删除key1和key2相同但val<$x的所有行

键1和键2不是不同的值;可以有多个记录具有相同的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?

我不确定主键是什么,所以我将其称为primary\u key

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

SELECT key1 as fk1, max(key2) as max_key2 from table group by key1
然后是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))
我还没有测试过这一点,但这大致是我将如何解决这个问题


它应该不用说,但在删除和备份之前要进行验证

使用多表删除语法,在该语法中,您可以使用键字段将表本身连接起来:

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

-我修改了示例数据,以使密钥对具有不同的val。

显示您尝试过的查询。对于key1=123和key2=2组合,val的最大值为3。因此,在这两种情况下,key2都小于3,那么为什么不删除该组合呢?对不起,现在编辑的帖子中有一个错误。我的意思是:对于任何给定的键1/键2对,我需要删除“val”小于最高“val”的所有行。在这种情况下,不应删除示例数据中的任何记录,因为每个键对的val都相同。