我正在尝试根据哈希值删除重复值(它们都具有相同的nid)。
我将使用相同的哈希离开最初的(最旧的)nid行。
出于某种原因,我收到错误,“您无法在FROM子句中为更新指定目标表'node_revision'
我正在尝试别名我的表,但这似乎不起作用 - 我做错了什么?
delete from node_revision
WHERE nid NOT IN(SELECT MIN(nid) FROM node_revision GROUP BY hash)
(时间戳只是为了说明,实际上并不想在任何查询中使用它)
| nid | hash | timestamp |
| 2 | 123456 | 123364600 |
| 2 | 123456 | 123364601 |
| 2 | 1234567 | 123364602 |
在这种情况下,第1行和第3行将存活。
答案 0 :(得分:1)
您可以将其标记为left join
:
delete nr from node_revision nr left join
(SELECT MIN(nid) as minnid
FROM node_revision
GROUP BY hash
) nrkeep
on nr.nid = nrkeep.minnid
where nrkeep.minnid is null;
你也可以“欺骗”MySQL使用子查询:
DELETE FROM node_revision
WHERE nid NOT IN (SELECT minnid
FROM (SELECT MIN(nid) as minnid FROM node_revision GROUP BY hash
) t
);
MySQL在update
和delete
语句中使用修改后的表格有明确的限制。此查询通过使用子查询实际实现minnids列表来解决限制。
编辑:
根据问题中的示例,您应该使用timestamp
,如下所示:
delete nr from node_revision nr left join
(SELECT hash, nid, min(timestamp) as mintimestamp
FROM node_revision
GROUP BY hash
) nrkeep
on nr.hash = nrkeep.hash and
nr.nid = nrkeep.nid and
nr.timestamp = nrkeep.mintimestamp
where nrkeep.minnid is null;