首页 > 解决方案 > 将 MySQL 中的非空重复行从多行减少到一

问题描述

我需要一个update语句来解决 MySQL 表中重复项的一些问题。表结构如下所示。我需要一个 MySQL 语句,它将重复的值设置为NULL除第一个之外的值,即具有最低 id 的值。这里的 id 是主键。

这是我所拥有的一个例子:

 id       name
  1        foo
  2        foo
  3        bar
  4        NULL
  5        NULL
  6        foo
  7        bar

这是期望的结果:

 id        name 
  1        foo
  2        NULL
  3        bar
  4        NULL
  5        NULL
  6        NULL
  7        NULL

该表还有其他包含有用信息的列。因此,不能简单地删除该行。

标签: mysqlsql

解决方案


我会这样写:

UPDATE t JOIN
       (SELECT name, MIN(id) as min_id
        FROM t
        GROUP BY name
       ) tt
       ON t.name = tt.name and t.id > tt.min_id
    SET t.name = NULL;

我认为使用JOIN. 基本上,它说要找到每个 id 的最小 id name。然后将所有其他行设置nameNULL


推荐阅读