从选择到MySQL中的更新

从选择到MySQL中的更新,mysql,duplicates,Mysql,Duplicates,我希望你能帮助我,我有一个小问题,但我不知道如何解决它,基本上我想更新所谓的duplicatedusernameid,并将其更新到用户数据库中。这是我的密码: UPDATE users SET duplicatedusernameid = (SELECT CONCAT(first_name,middle_name,last_name) ,COUNT(*)-1 AS duplicatedusernameid HAVING COUNT(*) > 1) WHERE id = 1 这是一个有效的

我希望你能帮助我,我有一个小问题,但我不知道如何解决它,基本上我想更新所谓的duplicatedusernameid,并将其更新到用户数据库中。这是我的密码:

UPDATE users SET duplicatedusernameid = (SELECT CONCAT(first_name,middle_name,last_name)
,COUNT(*)-1 AS duplicatedusernameid HAVING COUNT(*) > 1) WHERE id = 1
这是一个有效的选择函数,但是我想要更新,而不是选择,就像上面的一样,但是这个函数不起作用。以下是选择代码:

SELECT CONCAT(first_name,middle_name,last_name),COUNT(*)-1 AS duplicatedusernameid 
FROM users HAVING COUNT(*) > 1

因此,基本上我想获取DuplicatedUserName的值并对其进行更新。

您可以使用如下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;
桌子

如果删除where子句,则返回结果

解释

上面的SQL语句将获得每个唯一的名字、中间名和姓氏组合的计数。您可以通过在group by子句下面添加having count*>1来入围

然后,我们根据名字、中间名和姓氏的组合将users表与这个计数相关的表连接起来。只要存在匹配项,就更新users表中检索到的计数

SQLFiddle


定义不起作用。它是做什么的?@David好的,基本上它是做什么的它会得到名字、中间名和姓氏,它会得到重复的名字有多少人有相同的名字,然后我想把它更新到users表中,我们会得到有多少人有相同的名字的值。顺便说一句,上面的系统实际上可以区分,如果用户没有中间名,它将为空,只获取名字和姓氏的值,然后它将检查有多少人有相同的名字。这有意义吗?是要更新所有副本还是只更新特定副本?在SELECT语句中,您没有指定WHERE子句,而在UPDATE语句中,您的WHERE id=1,因此很容易混淆。请正确地重新表述所有这些内容,当您出现错误时,最好在问题中添加错误消息。@AllanVester:这并不能真正描述此代码的失败方式。选择返回什么?如果它不仅仅是一个标量值,那么我不确定该更新真正应该做什么,因为您将尝试使用一组值来更新一个值。这段代码是否有任何更新?有错误吗?WHERE子句能找到您要查找的记录吗?@ThomasG在更新部分,我实际上想使用WHERE id=以及其他一些东西,因为我使用的是Laravel,我可以从users表中获取用户id,只需执行这个简单的命令。其中id=?,[Auth::user->id]
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');
| 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