2016-11-15 45 views
1

您好我需要對重複數據的MySQL表進行一些反規範化操作。如何重複mysql數據的非規範化?

我的「出版物」表目前是這種格式:

Publications Source Table 

| title     |  author 
-------------------------------------------- 
| my paper    |  michael 
| my paper    |  bill 
| my paper    |  jill 
| other paper    |  tom 
| other paper    |  amy 
| third paper    |  ben 
| third paper    |  sophie 

我需要將其更改爲以下格式:

Publications Destination Table 

| title     | author | author2 | author 3 
|----------------------------------------------------------------- 
| my paper    | michael | bill  | jill 
| other paper    | tom  | amy  | 
| third paper    | ben  | sophie | 

現在,只爲您的信息,我需要做,所以我最終可以獲得一個CSV文件,以便將數據從舊系統導出到需要此格式的CSV文件的新系統中。

表中還有許多其他字段和源表中大約60,000行,但只有大約15,000個唯一標題。在源表中,每個作者有一行。在目的地,標題將是一個唯一的標識符。每個唯一的出版物標題需要一行。另外,我可以預先計算出任何一個出版物中作者的數量最多,如果這使問題更容易。

如何在MySQL中執行此操作?謝謝

+2

您的谷歌搜索字符串是'mysql pivot query' –

+1

上面的第一個表格設計比您想要創建的表格更好,但仍然需要工作。我希望發佈表只包含標題和發佈只能有一個值的任何其他信息。然後爲發佈可能具有多個值的每條信息單獨列出一張表。 – CptMisery

+1

請注意,我試圖獲取的格式只是其他人已經編寫導入程序的格式。這些數據最終會在一個高度規範化的企業數據庫系統中完成,但是供應商已經允許我們使用這種特定的CSV格式導入數據。 –

回答

2

如果你不真的想改變表的結構,而是隻想獲取數據,所以你可以將它導入到一個新的系統,你可以嘗試在MySQL中GROUP_CONCAT()函數:

SELECT title, GROUP_CONCAT(author SEPARATOR "|") AS authors FROM publications GROUP BY title;

我用管材作爲分隔符,有一個很好的機會,你的遊戲將包含逗號。如果您希望將其作爲csv文件,您可以對管道字符執行查找和替換操作,將其轉換爲需要的任何內容(例如,", ")。

+0

我認爲通過產生正確輸出的* query *可以更好地提供OP,而不是通過重組表來產生正確的輸出。 –

+0

這是一個正確的方向,我仍然必須添加標題列「author1,author2 ... author13」,並結合到文本文件,但這並不困難。 –

-1

我的建議是,你實際上規範化表,而不是爲補充作者添加新的列。所以,你的新表結構將是這個樣子:

Publications Source Table 

| title_id   |  title 
-------------------------------------------- 
| 1    |  my paper 
| 2    |  other paper 
| 3    |  third paper 


| title_id  |  author 
-------------------------------------------- 
| 1    |  michael 
| 1    |  bill 
| 1    |  jill 
| 2    |  tom 
| 2    |  amy 
| 3    |  ben 
| 3    |  sophie 
+0

爲什麼你會建議,因爲我需要這種格式的數據,所以它可以從舊系統導出到需要這種格式的CSV文件的新系統中。 –

+2

如果這個其他系統是「新」,你是否有任何控制權?你能改變它的要求嗎?還是主張改變?我提出的更符合標準數據庫設計實踐。使用你的設計,如果csv反映新的表結構,那麼對新系統中的表編寫查詢會困難得多。而且我的設計在每個作者的作者數方面更加靈活。當標題少於我假設頻繁出現的最大值時,您的設計會創建大量空白的作者字段。 – mba12

+0

添加新的代理ID號碼與標準化無關。 –