从表中删除 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的主要内容,如果未能解决你的问题,请参考以下文章