尝试根据MySQL中的哈希删除重复行

时间:2014-02-25 21:16:58

标签: mysql sql database

我正在尝试根据哈希值删除重复值(它们都具有相同的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行将存活。

1 个答案:

答案 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在updatedelete语句中使用修改后的表格有明确的限制。此查询通过使用子查询实际实现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;