根据最大值删除一行

11

我该如何构建一个MySQL查询以删除基于最大值的行。

我尝试过

WHERE jobPositonId = max(jobPostionId)

但是出现了错误?


2
我建议不要这样做。为什么你不知道要删除的行的特定id? - Your Common Sense
@Common Sense,正如问题所述,要删除的期望行是由最大值定义的行(而不是由ID定义的行)。这将在一个查询中完成您可能建议分为两个步骤的操作?也就是说,查询最大行的ID,然后删除该行。 - Aaron
4个回答

21
DELETE FROM table ORDER BY jobPositonId DESC LIMIT 1

太好了!在我的自引用表中一次性删除了所有行。(当然不带限制1) - Daniel Katz

16

使用:

DELETE FROM TABLE t1 
       JOIN (SELECT MAX(jobPositonId) AS max_id FROM TABLE) t2 
 WHERE t1.jobPositonId  = t2.max_id

请注意,如果存在重复项,则具有该jobPositonId值的所有行将被删除。

关于1093错误的愚蠢之处在于,您可以通过在自引用之间放置子查询来规避它:

DELETE FROM TABLE
 WHERE jobPositonId = (SELECT x.id
                         FROM (SELECT MAX(t.jobPostionId) AS id 
                                 FROM TABLE t) x)

解释

在使用UPDATEDELETE语句时,MySQL只会检查是否存在一个对同一张表进行更新的第一级子查询。因此,将其放在第二级(或更深层次)子查询中是可行的。但它只检查子查询 - JOIN语法在逻辑上是等效的,但不会触发错误。


@Robert de Klerk:请查看我的答案更新以解释这种行为。 - OMG Ponies

0
DELETE FROM `table_name` WHERE jobPositonId = (select max(jobPostionId) from `table_name` limit 1)

或者

DELETE FROM `table_name` WHERE jobPositonId IN (select max(jobPostionId) from `table_name` limit 1)

MySQL错误1093 - 无法在FROM子句中指定更新的目标表 - OMG Ponies
1
如果您使用Max函数而没有关联或分组,为什么还需要LIMIT子句呢? - Thomas
相同的错误 MySQL 错误 1093 - 无法在 FROM 子句中指定更新目标表 - Robert de Klerk
抱歉我的信息不准确,我没有时间测试它,+1 给 Konerak,他发布了正确的答案 ;) - el_quick

0

这个有效:

SELECT @lastid := max(jobPositonId ) from t1; 
DELETE from t1 WHERE jobPositonId = @lastid ; 

除了两次访问数据库之外,这种技术还有什么问题吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接