2011-06-14 47 views
2

給出一個MySQL數據庫與表如下:合併相關數據時,一列應該成爲唯一

author: 
+----+----------+ 
| id | name  | 
+----+----------+ 
| 1 | John  | 
| 2 | Peter | 
| 3 | Peter | 
+----+----------+ 

article: 
+----+-----------+------+ 
| id | author_id | text | 
+----+-----------+------+ 
| 1 | 2   | ... | 
| 2 | 3   | ... | 
| 3 | 3   | ... | 
+----+-----------+------+ 

筆者表的名字列沒有被意外設置爲唯一的。現在,我必須將相關文章「合併」爲相關作者之一,即將第2條和第3條的author_id設置爲2.我希望在此之後使名稱列獨一無二。

我無法手動重新分配文章,因爲受影響的記錄太多。但我認爲這個問題可能有一個現成的解決方案/片段。

+0

這個問題不是很清楚,你能展示一個你想得到什麼的例子嗎? – VAShhh 2011-06-14 12:44:01

+0

我認爲我不需要通過「將第2條和第3條的author author_id設置爲2」來「寫」另一個ASCII表......「 – fishbone 2011-06-14 12:48:57

+0

你檢查了我的答案嗎? – 2011-06-15 05:48:07

回答

1

要更新article表,這將這樣的伎倆:

update article art 
    set art.author_id = (select min(aut.id) 
          from author aut 
         where aut.name = (select a.name 
              from author a 
              where a.id = art.author_id)); 

select * from article;  
+ ------- + -------------- + --------- + 
| id  | author_id  | text  | 
+ ------- + -------------- + --------- + 
| 1  | 2    |   | 
| 2  | 2    |   | 
| 3  | 2    |   | 
+ ------- + -------------- + --------- + 
3 rows 

如果你喜歡一個更緊湊的更新(和更優化的),那麼你可以使用這一項,即以同樣的方式:

update article art 
    set art.author_id = (select min(aut.id) 
          from author aut 
         inner join author a on a.name = aut.name 
         where a.id = art.author_id); 

最後,刪除多餘的作者,你需要

delete a 
    from author a 
inner join (
    select name, min(id) as min -- this subquery returns all repeated names and their smallest id 
     from author 
    group by name 
    having count(*) > 1) repeated on repeated.name = a.name 
where a.id > repeated.min;  -- delete all repeateds except the first one 

select * from author;  
+ ------- + --------- + 
| id  | name  | 
+ ------- + --------- + 
| 1  | John  | 
| 2  | Peter  | 
+ ------- + --------- + 
2 rows 

這適用於任何數量的重複作者集。

希望這會有所幫助

0

你可以先做一個更新的文章使用具有然後刪除同名

PS較高的作者同名

UPDATE art SET art.author_id = 
    (SELECT MIN(a1.id) FROM author a1 WHERE a1.Name = a2.name 
     FROM article art INNER JOIN author a2 ON art.author_id = a2.id) 

最低作者ID。我沒有測試過SQL,但應該可以工作。

+0

我以前從未在單個選擇查詢中見過兩個「from」。我無法運行沒有更新的選擇查詢。這是一個特殊的事情,只能與「udpate」或錯誤一起使用嗎? – fishbone 2011-06-14 13:05:02

相關問題