我需要一个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
该表还有其他包含有用信息的列。因此,该行不能只是简单地删除。
答案 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
答案 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;