2017-03-06 60 views
1

我有這樣不同的值來讓MySQL更新重複列列

CREATE TABLE IF NOT EXISTS users_groups(
    id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 
    user_id INT(11) UNSIGNED NOT NULL, 
    name VARCHAR(250) NOT NULL, 
    is_deleted BOOLEAN NOT NULL DEFAULT false, 
    creation_date DATETIME NOT NULL, 
    last_modification_date DATETIME NOT NULL, 
    PRIMARY KEY (id) 
); 

一個表,我想談談列(USER_ID,名)作爲唯一的,但我的問題是,我該列中已經有重複項。在某些情況下,這些列重複多次。

我想編寫一個查詢來更新重複名稱行中連接某些值的重複行,例如將第一個重複的'**'連接爲第二個重複的連接'*',依此類推。

這是可能寫一個查詢嗎?

我能得到我想要修改的組,但我不知道是否有可能實現什麼,我想與MySQL

select users_groups.id, users_groups.user_id, users_groups.name 
from users_groups 
inner join (select user_id, name, count(*) from users_groups group by user_id, name having count(*) > 1) as u on u.user_id = users_groups.user_id 
where users_groups.name = u.name; 

回答

1

試試這個。

SET @prev_user_id := ''; 
SET @prev_name := ''; 
SET @cnt := 0; 

select s.id, s.user_id, s.name 
from 
(
    select 
    users_groups.id,  
    IF(@prev_user_id <> users_groups.user_id OR @prev_name <> users_groups.name, @cnt := 0, @cnt := @cnt + 1) AS cnt, 
    CONCAT(users_groups.user_id, REPEAT('*', @cnt)) AS user_id, 
    CONCAT(users_groups.name, REPEAT('*', @cnt)) AS name, 
    @prev_user_id := users_groups.user_id, 
    @prev_name := users_groups.name 
    from 
    users_groups 
) s 

入住這裏: http://sqlfiddle.com/#!9/6d553/10

+0

謝謝你的回答。它沒有工作,我不知道爲什麼,但它不能識別select語句中的變量'@ cnt'。 – agusgambina

+0

@agusgambina對不起使用了錯誤的文本,請重試。 – ydoow

+0

謝謝你的工作,我只需要在'set'和'select'之間添加'update'語句並在末尾添加id的'where'子句。 – agusgambina

0

我不知道這會有所幫助,但你可以使一列獨一無二,而不必成爲該表的主鍵。

例如:

CREATE TABLE user (
    user_id NOT NULL, 
    firstname varchar(255) NOT NULL, 
    UNIQUE (firstname) 
) 

或創建多個列的唯一約束下面的語句。

CREATE TABLE user (
    user_id NOT NULL, 
    firstname varchar(255) NOT NULL, 
    CONSTRAINT constraint_name UNIQUE (user_id, firstname) 
) 

此外,我不完全確定你爲什麼要識別重複。最好避免完全重複記錄和數據輸入。這可以通過表格規範化以及使用適當的索引來完成。

我希望這有助於某種方式。

+1

我可能誤解了你的問題。但是,最好避免重複。如果您使用正確的索引和鍵,那麼您將永遠不會有完全重複的行。您可能在一行中有與其他行重複的列,但不會使用這些行來標識單個記錄。 –

+0

@Chris_Mulheron感謝您的回答。我完全同意你的看法,但這已經發生了,我必須解決它。 – agusgambina

+0

我會手動解決此問題,然後應用您的解決方案。 – agusgambina