Mysql 从名字和姓氏生成唯一的用户名?

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

我的数据库中有很多用户,我想把他们所有的用户名重置为他们名字的第一个字母,加上他们的全名。正如你所能想象的,这里有一些骗局。在这个场景中,我想在用户名的末尾添加一个2或3之类的字符。如何编写查询以生成这样的唯一用户名

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