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

时间:2011-09-22 18:53:51

标签: mysql

我的数据库中有很多用户,我想将所有用户名重置为他们名字的第一个字母,加上他们的完整姓氏。你可以想象,有一些欺骗。在这种情况下,我想在用户名的末尾添加“2”或“3”或其他内容。如何编写查询以生成这样的唯一用户名?

UPDATE user
SET username=lower(concat(substring(first_name,1,1), last_name), UNIQUETHINGHERE)

3 个答案:

答案 0 :(得分:7)

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;

这取决于主键id,因此对于插入bar的每条记录,我们只计算fooid小于bar.id的重复项}。

鉴于foo:

select * from foo;
+----+------+--------+--------+
| id | user | first  | last   |
+----+------+--------+--------+
|  1 | aaa  | Roger  | Hill   | 
|  2 | bbb  | Sally  | Road   | 
|  3 | ccc  | Fred   | Mount  | 
|  4 | ddd  | Darren | Meadow | 
|  5 | eee  | Sharon | Road   | 
+----+------+--------+--------+

上述INSERT进入bar,结果为:

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)

答案 1 :(得分:4)

作为两个人:

SELECT max(username)
FROM user
WHERE username LIKE concat(lower(concat(substring(first_name,1,1),lastname), '%')

检索该名称组合的“最高”用户名。提取数字后缀,递增它,然后插回到新用户的数据库中。

当然,这很有趣。具有相同名字/姓氏的两个用户可能会踩踏彼此的用户名,具体取决于事情的运作方式。您肯定希望在查询上添加一些事务/锁定,以确保没有任何用户发生冲突。

答案 2 :(得分:0)

没关系....我刚刚找到了傻瓜:

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;

手动设置这些。只是屈指可数。