我正在尝试根据哈希值删除重复值(它们都具有相同的 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 行将保留。
最佳答案
您可以将其表达为左连接
:
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;
关于mysql - 尝试根据 MySQL 中的哈希删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026383/