我的数据库中有很多用户,我想将所有用户名重置为他们名字的第一个字母,加上他们的完整姓氏。你可以想象,有一些欺骗。在这种情况下,我想在用户名的末尾添加“2”或“3”或其他内容。如何编写查询以生成这样的唯一用户名?
UPDATE user
SET username=lower(concat(substring(first_name,1,1), last_name), UNIQUETHINGHERE)
答案 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
的每条记录,我们只计算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)
答案 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;
手动设置这些。只是屈指可数。