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

标签 mysql

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

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

最佳答案

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 中的每条记录,我们只计算在 foo 中找到的重复项与 id小于 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)

关于mysql - 从名字和姓氏生成唯一的用户名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7519892/

相关文章:

java - 在实体中添加新字段日期时出现错误

mysql - 如何从另一个表中获取有关一个不同列的更多信息?

mysql - 选择 ... CASE WHEN ... ORDER BY 别名

mysql - 可以用表示该 FK 的完整可能值集的 BOOLEAN 属性替换引用 ("Type") 实体 FK 吗?

php - 如何在php中命名上传的文件以防止它们被覆盖?

mysql - 根据另一个表的 ID 查询一个表中的数据

mysql - 我如何使用连接获取成员计数

mysql - 如何在 SQL 中获取具有两个对应列的记录?

mysql - 正确连接多个表

javascript - 将 MySQL 查询结果传递给 JavaScript 函数