2016-03-03 32 views
0

我有一个产品表:外键(fk id),名称和更多的数据。
有在名称重复,但也有例如有关FK ID
所以我想更新重复的列他们的外键 - mysql

例子中,第一个匹配的FK ID更新重复的客户:

fk id name 
1  abc 
2  abc 
3  abc 
67  abc 

表后更新:

fk id  name 

1   abc 

1   abc 

1   abc 

1   abc 

到目前为止,我有一个查询,把它们放在一起在一个逗号分隔的列表,但我错过了更新:

SELECT 
count(*) as amount, 
group_concat(name) as names, 
group_concat(id) as ids 
FROM db.product 
GROUP BY name 
HAVING amount> 1; 
+0

通过第一ID匹配你的意思了最低所有ID的:因为在MySQL中,你不能从正在更新的同桌,所以子查询的一个额外层的子选择的顶部增加选择一样的名字? – Shadow

+0

是的,第一个匹配每个名字的ID –

回答

1

在MySQL中,你可以使用joins in update statements。我会创建一个子查询,为每个出现多次的名称返回最低的id(min())。

UPDATE db.product 
INNER JOIN (SELECT * FROM 
(SELECT name, min(id) as minid 
FROM db.product 
GROUP BY name 
HAVING count(*)> 1) t2) t on t.name=db.product.name 
SET db.product.id=t.minid; 
+0

谢谢@阴影。 –