将MySQL中不为空的重复行从多减少为一

时间:2019-01-31 08:20:57

标签: mysql sql

我需要一个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

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

3 个答案:

答案 0 :(得分:1)

我会这样写:

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更容易遵循逻辑。基本上说是找到每个name的最小ID。然后将同一name的所有其他行设置为NULL

答案 1 :(得分:0)

您的UPDATE查询可以包含JOIN

例如加入每个名称的最小ID,并仅在ID不是最小的ID处更新。

UPDATE
    t
    LEFT OUTER JOIN (
        SELECT
            MIN(id) AS id
        FROM
            t
        GROUP BY
            name
    ) t1 ON t.id = t1.id
SET
    t.name = NULL
WHERE
    t1.id IS NULL

DB Fiddle

答案 2 :(得分:0)

UPDATE t JOIN
   (SELECT name, MIN(id) as min_id
    FROM t
    WHERE name IS NOT NULL
    GROUP BY name
    HAVING COUNT(*) > 1
   ) tt
   ON t.name = tt.name and t.id > tt.min_id
SET t.name = NULL;