我已经通过这里发布的一些解决方案,但没有一个解决了我的问题。
我想设置我的用户名列以接收现在唯一的用户名。
但为此,我需要在某些情况下重命名,已经注册了1000多个重复的用户名。
我尝试了这个解决方案:
UPDATE profile n
JOIN (SELECT username, MIN(profile_id) min_id FROM profile
GROUP BY username HAVING COUNT(*) > 1) d
ON n.username = d.username AND n.profile_id <> d.min_id SET n.username = CONCAT(n.username, '1');
但是它给了我相同的用户名,例如tony,tony1,tony11,tony111等等,直到tony1111111111111 ......最多1000个,使用户名长有很长的长度。
我想要一个解决方案,在用户名字后只获得4digites。 0001,0002,0003,0004 .... 1000
有人可以帮助我吗?
提前谢谢
答案 0 :(得分:1)
如下:
UPDATE profile n JOIN (
SELECT profile_id, username, (@row_number:=@row_number+1) as cntr
FROM profile, (SELECT @row_number:=0) AS t
WHERE username IN ( SELECT username
FROM profile
GROUP BY username HAVING COUNT(*) > 1 )
and (username, profile_id) not in ( SELECT username, MIN(profile_id)
FROM profile
GROUP BY username HAVING COUNT(*) > 1 )
) d ON n.profile_id = d.profile_id
SET n.username = CONCAT(n.username, d.cntr);
这是我现在能想到的最好的......问题是它将在所有用户名之间共享计数器......你将拥有Alejandro,Alejandro1,Pedro,Pedro2,Juan,Juan3。 ....
答案 1 :(得分:0)
我相信你评论过的这个是错的......没有更新。只选择:select * from profile n JOIN(SELECT username,min_id,@ row_number:= @ row_number + 1 as cntr FROM(SELECT username,MIN(profile_id)min_id FROM profile GROUP BY username HAVING COUNT(*)&gt; 1)AS t2,(SELECT @row_number:= 0)AS t)d ON n.username = d.username