2016-04-13 23 views
-3

我希望你能幫我解決這個問題,但我不知道如何解決這個問題,基本上我想更新所謂的duplicateatedusernameid,並且將其更新到用戶數據庫中。這裏是我的代碼:從SELECT到MySQL中的更新

UPDATE users SET duplicatedusernameid = (SELECT CONCAT(first_name,middle_name,last_name) 
,COUNT(*)-1 AS duplicatedusernameid HAVING COUNT(*) > 1) WHERE id = 1 

這裏是工作的SELECT函數,而不是選擇我想更新,就像上面的那個,但那一個不工作。這裏是選擇代碼:

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

所以基本上我想獲得dupatedusernameid的值並更新它。

+0

定義 「不工作」。它有什麼作用? – David

+0

@David好吧,基本上它會得到第一個,中間和最後一個名字,它會得到重複項(有多少人具有相同的名稱),然後我想將其更新到users表中,並獲得有多少人有同樣的名字。順便說一句,上面這個系統實際上可以區分,如果用戶沒有中間名,它只會是空白的,只能得到名字和姓氏的值,然後它會檢查有多少名稱相同。那有意義嗎? –

+0

你想更新**所有**重複或只有**特定** **?在你的SELECT語句中,你沒有指定WHERE子句,而在你的'UPDATE'語句中你有'WHERE id = 1',所以它很混亂。請更正所有這些問題,並且當您遇到錯誤時,向問題添加錯誤消息總是一個好主意。 –

回答

0

您可以使用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