从表中删除 WHERE NOT MAX

Posted

技术标签:

【中文标题】从表中删除 WHERE NOT MAX【英文标题】:DELETE FROM table WHERE NOT MAX 【发布时间】:2013-10-10 22:21:16 【问题描述】:

好的,所以我有一个有 xid 的表。每个 xid 可以有多个 pid。我正在尝试删除除每个 xid 具有最高 pid 的行之外的所有内容。

我正在尝试:

DELETE FROM table WHERE `pid` NOT IN
( SELECT MAX(`pid`)
  FROM table
  GROUP BY `xid`
)

如果我使用相同的查询,但使用 SELECT 而不是 DELETE,我会得到我想要删除的所有记录。当 DELETE 存在时,我收到错误:

#1093 - You can't specify target table 'mod_personnel' for update in FROM clause

【问题讨论】:

mysql 限制...您不能在子选择中引用您正在删除/更新的表。 【参考方案1】:

使用 JOIN 而不是 NOT IN:

DELETE t1.* FROM table t1
LEFT JOIN (SELECT xid, MAX(pid) pid
           FROM table
           GROUP BY xid) t2
ON t1.pid = t2.pid
WHERE t2.pid IS NULL

【讨论】:

我认为您还打算将and t1.xid = t2.xid 添加到联接中。 @sgeddes 可能是对的,但原始查询与 xid 不匹配。 他说将原始更改为 SELECT 显示正确的行集。这相当于他的NOT IN 尝试。我的猜测是pid 是独一无二的,所以不管怎样都可以。 是的,我只是在想如果它是独一无二的,那么它就不需要了! +1【参考方案2】:
DELETE FROM table WHERE `pid` NOT IN
(SELECT maxpid FROM
    ( SELECT MAX(`pid`) as maxpid
      FROM table
      GROUP BY `xid`
    )as m
)

【讨论】:

这不是和原始查询遇到同样的限制吗?

以上是关于从表中删除 WHERE NOT MAX的主要内容,如果未能解决你的问题,请参考以下文章

使用动态 where 语句从表中选择一个值

从表中选择或在 codeigniter 中的 where 和运算符中选择

在 where 子句中使用子查询从表中选择第二大日期

从表中选择 WHERE 子句中具有不同 IN 列表的表

PHP从表中选择不起作用

SQL 从表中选择并获取表名