【问题标题】:Deleting a row based on the max value根据最大值删除一行
【发布时间】:2011-04-06 23:06:42
【问题描述】:

如何构造一个 mySQL 查询以根据最大值删除一行。

我试过了

WHERE jobPositonId = max(jobPostionId)

但有错误?

【问题讨论】:

  • 我建议不要这样做。你怎么不知道要删除的行的某个id?
  • @Common Sense,正如问题所述,要删除的所需行是由最大值定义的行(而不是由 id 定义的行)。这将在一个查询中完成您可能建议在两个查询中执行的操作?即查询最大行的id;然后删除该行。

标签: mysql sql max sql-delete mysql-error-1093


【解决方案1】:
DELETE FROM table ORDER BY jobPositonId DESC LIMIT 1

【讨论】:

  • 完美!一次删除了我的自引用表中的所有行。 (当然没有限制1)
【解决方案2】:

用途:

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)

说明

MySQL 仅在使用 UPDATEDELETE 语句时检查是否存在对正在更新的同一个表的第一级子查询。这就是为什么将它放在第二级(或更深)子查询替代方案中的原因。但它只检查子查询 - JOIN 语法在逻辑上是等效的,但不会触发错误。

【讨论】:

  • @Robert de Klerk:请参阅我的回答更新以解释这种行为。
【解决方案3】:
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 子句中指定更新的目标表
  • 如果您使用没有关联或分组依据的 Max,为什么还需要 LIMIT 子句?
  • 同样的错误 MySQL 错误 1093 - 无法在 FROM 子句中指定要更新的目标表
  • 抱歉我的错误信息,我没有时间测试它,为 Konerak +1,他发布了正确的答案 ;)
【解决方案4】:

这行得通:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2019-10-10
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多