2016-07-26 24 views
0

我有一個簡單的表是這樣的:整形表,以便日期是成列的順序在MySQL

| ID | Time1 | Time2 | Time3 | 
|----|-------|-------|-------| 
| 1 | 2005 |  |  | 
| 2 | 2003 | 2004 | 2005 | 
| 3 | 2004 |  |  | 
| 4 | 2003 | 2005 |  | 
| 5 | 2005 |  |  | 

是否有重塑這個表,並用這樣的表來結束適度無痛的方法?你可以看到,我想要排列在3 TimeN列中格式不正確的值,以便它們按順序排序,並且在日期不存在的地方有空值。

| ID | Time1 | Time2 | Time3 | 
|----|-------|-------|-------| 
| 1 |  |  | 2005 | 
| 2 | 2003 | 2004 | 2005 | 
| 3 |  | 2004 |  | 
| 4 | 2003 |  | 2005 | 
| 5 |  |  | 2005 | 

我認爲必須比我目前正在擴展的50行可怕的MySQL更簡單一些。

+0

請定義「傳播我的數據」。怎麼樣? – FrankerZ

+0

這幾年有多少列?它可以像6或50一樣易於管理嗎? – WOUNDEDStevenJones

+0

降價格式化表格的圖片勝過千言萬語!無論如何,我編輯了這個問題。 –

回答

1

有沒有神祕的SQL語句會這樣做。

你將來需要這種值分配給每一列的SQL語句,是這樣的:你先建立一個新的工作表中

UPDATE mysimpletable t 
    SET t.Time1 = expr 
     , t.Time2 = expr 
     , t.Time3 = expr 

我推薦。獲得一個SELECT語句,返回你之後的結果。

如果您可以確定每列中的值,這將是最簡單的。如果2003是你的最低值,並且希望該出現在時間1列,如果該值出現在任何踢門列,固定在特定的列中的每個值,像這樣:

SELECT s.id 
     , IF('2003' IN (s.Time1,s.Time2,s.Time3),'2003',NULL) AS Time1 
     , IF('2004' IN (s.Time1,s.Time2,s.Time3),'2004',NULL) AS Time2 
     , IF('2005' IN (s.Time1,s.Time2,s.Time3),'2005',NULL) AS Time3 
    FROM mysimpletable s 
    ORDER BY s.id 

如果返回導致你後,假設id列是一個非空的唯一關鍵,我會做一個:

CREATE TABLE newtable (PRIMARY KEY (id)) AS SELECT ... 

一旦我肯定是正確的,只是他們我會進行更新。

UPDATE newtable s 
    JOIN mysimpletable t 
    ON t.id = s.id 
    SET t.Time1 = s.Time1 
     , t.Time2 = s.Time2 
     , t.Time3 = s.Time3 

該方法應該適用於示例數據。但是,這又假設我們知道2003年將存儲在Time1中,而2004年是存儲在Time2中的值等。

可能有一種更簡單,更簡單的方法。但是,這是我會採取的方法...我會首先與SELECT語句,開發返回每個列的值的表達式。然後從該SELECT中創建一個臨時工作表。然後,在確定這是我想要的之後,我會使用工作表作爲源執行UPDATE。

但我也在質疑爲什麼表格被設計成它的方式,因此首先要求執行這種類型的更新。

+0

很棒的回答。非常感激。 –

+0

......尤其是最後一段 – Strawberry

相關問題