您可以使用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
來將其列入清單。
然後,我們根據第一個,中間和最後一個名稱組合,將用戶表與此計數相關的表加入。只要有匹配,就更新用戶表中檢索到的計數。
SQLFiddle
http://sqlfiddle.com/#!9/c43ea/1
定義 「不工作」。它有什麼作用? – David
@David好吧,基本上它會得到第一個,中間和最後一個名字,它會得到重複項(有多少人具有相同的名稱),然後我想將其更新到users表中,並獲得有多少人有同樣的名字。順便說一句,上面這個系統實際上可以區分,如果用戶沒有中間名,它只會是空白的,只能得到名字和姓氏的值,然後它會檢查有多少名稱相同。那有意義嗎? –
你想更新**所有**重複或只有**特定** **?在你的SELECT語句中,你沒有指定WHERE子句,而在你的'UPDATE'語句中你有'WHERE id = 1',所以它很混亂。請更正所有這些問題,並且當您遇到錯誤時,向問題添加錯誤消息總是一個好主意。 –