Mysql 从名字和姓氏生成唯一的用户名?
我的数据库中有很多用户,我想把他们所有的用户名重置为他们名字的第一个字母,加上他们的全名。正如你所能想象的,这里有一些骗局。在这个场景中,我想在用户名的末尾添加一个2或3之类的字符。如何编写查询以生成这样的唯一用户名Mysql 从名字和姓氏生成唯一的用户名?,mysql,Mysql,我的数据库中有很多用户,我想把他们所有的用户名重置为他们名字的第一个字母,加上他们的全名。正如你所能想象的,这里有一些骗局。在这个场景中,我想在用户名的末尾添加一个2或3之类的字符。如何编写查询以生成这样的唯一用户名 UPDATE user SET username=lower(concat(substring(first_name,1,1), last_name), UNIQUETHINGHERE) 作为两方: SELECT max(username) FROM user WHERE use
UPDATE user
SET username=lower(concat(substring(first_name,1,1), last_name), UNIQUETHINGHERE)
作为两方:
SELECT max(username)
FROM user
WHERE username LIKE concat(lower(concat(substring(first_name,1,1),lastname), '%')
检索该名称组合的最高用户名。提取数字后缀,增加它,然后为新用户重新插入数据库
当然,这很活泼。两个名字/姓氏相同的用户可能会踩对方的用户名,这取决于事情的发展。您肯定希望在查询上添加一些事务/锁定,以确保没有任何用户冲突
CREATE TABLE bar LIKE foo;
INSERT INTO bar (id,user,first,last)
(SELECT f.id,CONCAT(SUBSTRING(f.first,1,1),f.last,
(SELECT COUNT(*) FROM foo f2
WHERE SUBSTRING(f2.first,1,1) = SUBSTRING(f.first,1,1)
AND f2.last = f.last AND f2.id <= f.id
)),f.first,f.last from foo f);
DROP TABLE foo;
RENAME TABLE bar TO foo;
上述插入到杆中,导致:
select * from bar;
+----+----------+--------+--------+
| id | user | first | last |
+----+----------+--------+--------+
| 1 | RHill1 | Roger | Hill |
| 2 | SRoad1 | Sally | Road |
| 3 | FMount1 | Fred | Mount |
| 4 | DMeadow1 | Darren | Meadow |
| 5 | SRoad2 | Sharon | Road |
+----+----------+--------+--------+
要从用户名末尾删除1
INSERT INTO bar (id,user,first,last)
(SELECT f3.id,
CONCAT(
SUBSTRING(f3.first,1,1),
f3.last,
CASE f3.cnt WHEN 1 THEN '' ELSE f3.cnt END),
f3.first,
f3.last
FROM (
SELECT
f.id,
f.first,
f.last,
(
SELECT COUNT(*)
FROM foo f2
WHERE SUBSTRING(f2.first,1,1) = SUBSTRING(f.first,1,1)
AND f2.last = f.last AND f2.id <= f.id
) as cnt
FROM foo f) f3)
无所谓。。。。我刚刚找到了那些傻瓜:
select LOWER(CONCAT(SUBSTRING(first_name,1,1),last_name)) as new_login,count(* ) as cnt from wx_user group by new_login having count(* )>1;
并手动设置这些参数。只有少数。受unutbu答案的启发:不需要创建额外的表,也不需要几个查询:
UPDATE USER a
LEFT JOIN (
SELECT USR_ID,
REPLACE(
CONCAT(
SUBSTRING(f.`USR_FIRSTNAME`,1,1),
f.`USR_LASTNAME`,
(
(SELECT IF(COUNT(*) > 1, COUNT(*), '')
FROM USER f2
WHERE SUBSTRING(f2.`USR_FIRSTNAME`,1,1) =
SUBSTRING(f.`USR_FIRSTNAME`,1,1)
AND f2.`USR_LASTNAME` = f.`USR_LASTNAME`
AND f2.`USR_ID` <= f.`USR_ID`)
)
),
' ',
'') as login
FROM USER f) b
ON a.USR_ID = b.USR_ID
SET a.USR_NICKNAME = b.login
我希望用纯MySQL做这个。。。这需要我对所有用户进行循环,不是吗?是什么?为什么结尾有三个引号?想解释一下吗?@Mark:bar是一张像foo一样的空桌子。将记录插入bar后,您可以删除foo并重命名bar->foo。三重引号是Python的产物,我在这里测试了代码。我只想更新用户表,但我想我可以很容易地将其传输回去。那很酷。如果数字是1,我也会省去它,但同样,这应该很容易做到。美好的谢谢!编辑:正如你的评论所解释的。我尽了最大努力在这个问题上添加了足够的缩进,以使其可读,但这个问题的编写方式有点怪异。为什么要投否决票?这可能是可怕的,但它的工作,它可以帮助人们,我有同样的问题,这是我找到的解决办法,否决这给了一个想法,这是错误的!我没有投反对票,但正如最初回答的那样,没有缩进使它无法阅读。我打赌这就是原因。我明白了,根据你提供的链接,也不鼓励你投反对票。我同意它不可读,但我只是想给人们一些东西来复制、粘贴和继续。不管怎样,谢谢你的评论。你能解释一下它的用途/工作原理吗?看起来你在这里和那里扮演一个角色,但我真的不知道它在做什么。
UPDATE USER a
LEFT JOIN (
SELECT USR_ID,
REPLACE(
CONCAT(
SUBSTRING(f.`USR_FIRSTNAME`,1,1),
f.`USR_LASTNAME`,
(
(SELECT IF(COUNT(*) > 1, COUNT(*), '')
FROM USER f2
WHERE SUBSTRING(f2.`USR_FIRSTNAME`,1,1) =
SUBSTRING(f.`USR_FIRSTNAME`,1,1)
AND f2.`USR_LASTNAME` = f.`USR_LASTNAME`
AND f2.`USR_ID` <= f.`USR_ID`)
)
),
' ',
'') as login
FROM USER f) b
ON a.USR_ID = b.USR_ID
SET a.USR_NICKNAME = b.login