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

标签 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 行将保留。

最佳答案

您可以将其表达为左连接:

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;

关于mysql - 尝试根据 MySQL 中的哈希删除重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22026383/

相关文章:

php - 内部连接错误

sql - Oracle Apex SQL 错误 Ora-00942 : table or view does not exist

mysql - 使用 MySQL 进行数学运算

mysql - 从列中提取数据并用它来更新另一列

javascript - 如何在外部文件中创建选择菜单并将其嵌入到 html 中以显示菜单

mysql - 将未知数量的数据显示为列名

sql - 是 CRUD DDL 还是 DML 操作?

mysql - 从 phpMyAdmin 中找出 MySQL 数据库 URL

php - 使用 php 服务器聊天 android 的可行性?

mysql - 将数据从 csv 导入到 mariaDB 缺少第一列