我希望你能帮我解决这个问题,我对此有点问题,但我不知道如何解决,基本上我想更新所谓的重复用户名ID,并将其更新到用户数据库中。这是我的代码:
UPDATE users SET duplicatedusernameid = (SELECT CONCAT(first_name,middle_name,last_name)
,COUNT(*)-1 AS duplicatedusernameid HAVING COUNT(*) > 1) WHERE id = 1
这是一个有效的SELECT函数,但我想要的不是SELECT,而是UPDATE,就像上面的那个函数一样,但那个函数不起作用。这是SELECT代码:
SELECT CONCAT(first_name,middle_name,last_name),COUNT(*)-1 AS duplicatedusernameid
FROM users HAVING COUNT(*) > 1
所以基本上我想得到重复的用户名ID的值并更新它。
您可以使用这样的SQL语句:
update users a
inner join (
-- get the count for a user
SELECT first_name, middle_name, last_name, COUNT(*)-1 AS duplicatedusernameid
from users
group by first_name, middle_name, last_name
) b
on a.first_name = b.first_name
and a.middle_name = b.middle_name
and a.last_name = b.last_name
set a.duplicatedusernameid = b.duplicatedusernameid
where a.id = 1;
表格
create table users (
id int,
first_name varchar(100),
middle_name varchar(100),
last_name varchar(100),
duplicatedusernameid varchar(100)
);
insert into users (id, first_name, middle_name, last_name) values
(1, 'John', '', 'Smith'),
(2, 'John', '', 'Smith'),
(3, 'Jessie', '', 'Marcus'),
(4, 'Jessie', '', 'Marcus'),
(5, 'Jessie', '', 'Marcus'),
(6, 'Don', '', 'Kassieth');
结果(如果删除where子句)
| id | first_name | middle_name | last_name | duplicatedusernameid |
|----|------------|-------------|-----------|----------------------|
| 1 | John | | Smith | 1 |
| 2 | John | | Smith | 1 |
| 3 | Jessie | | Marcus | 2 |
| 4 | Jessie | | Marcus | 2 |
| 5 | Jessie | | Marcus | 2 |
| 6 | Don | | Kassieth | 0 |
解释
SELECT first_name, middle_name, last_name, COUNT(*)-1 AS duplicatedusernameid
from users
group by first_name, middle_name, last_name
上面的SQL语句将获得每个唯一的名字、中间名和姓氏组合的计数。您可以通过在group by
子句下面添加having count(*) > 1
来入围。
然后,我们将users表和这个基于名字、中间名和姓氏组合的计数相关表连接起来。只要有匹配项,就更新用户表中检索到的计数。
SQLFiddle
http://sqlfiddle.com/#!9/c43ea/1