2012-12-11 36 views
1

我現在有被以這樣的方式,其中的條目(以前的編碼器的工作)是多行3列的表格格式化的34930054行MySQL數據庫,即:如何執行MySQL查詢來格式化和移動數據?

Part number 1 | height | 5cm 
Part number 1 | length | 10cm 
Part number 1 | width | 5cm 
Part number 2 | length | 1cm 
Part number 2 | height | 3cm 
Part number 2 | width | 8cm 

我想將數據合併到清潔2列表以備後用。即:

Part number 1 | height: 5cm <br /> length: 10cm <br /> width: 5cm 
Part number 2 | height: 1cm <br /> length: 3cm <br /> width: 8cm 

如何可以做一個FIND與相同的部件編號,INSERT行的所有行到新的表中的2列(部件號在第1列上述格式和所有的2列和3從數據原始表放入新表的第2列)?

+0

你到目前爲止做了什麼!!! – diEcho

+0

@diEcho:就是這樣,我甚至不知道從哪裏開始!我不想把它搞砸,否則我會坐在這裏等着它走過將近35米的行,然後意識到一個錯誤。 – Dave

+0

建議:不要被嚇到..開始寫作..一旦你寫下它並且嘗試從你的錯誤中學習。 – diEcho

回答

1

試試這個:

INSERT INTO parts_new (partnum, description) 
SELECT partNum, GROUP_CONCAT(CONCAT(measurement_type, ' : ', measurement_value) 
       ORDER BY FIELD(measurement_type, 'height', 'length', 'width') 
       SEPARATOR ' <br /> ') description 
FROM parts_old 
GROUP BY partNum 

OR

INSERT INTO parts_new (partnum, width, LENGTH, height) 
SELECT partNum, SUM(width) width, SUM(LENGTH) LENGTH, SUM(height) height 
FROM (SELECT partNum, IF(measurement_type='width', measurement_value, 0) width, 
     IF(measurement_type='height', measurement_value, 0) height, 
     IF(measurement_type='length', measurement_value, 0) LENGTH 
FROM parts_old) AS A 
GROUP BY partNum 

檢查鏈接MySQL INSERT INTO...SELECT

+0

謝謝@Saharsh Shah - 我要去試試看! :) – Dave

+0

+1我相信你的'ORDER BY'語句不合適,但這是一般的想法。 –

+0

@macek:是嗎?此外,這只是重新格式化現有的表格? – Dave

0

由於我不知道你的真實表和列名,我要去假裝他們看起來像這樣:

parts_old(db表)

partnum measurement_type measurement_value 
------- ---------------- ----------------- 
1   width    5 
1   length   10 
1   height   5 
2   width    8 
2   length   1 
2   height   3 

如果我正確理解你的問題,你想用以下落得:

parts_new(db表)

partnum width length height 
------- ----- ------ ------ 
1   5  10  5 
2   8  1  3 

後使用適當的列類型構建新表格,可以使用以下SQL將數據從舊錶格遷移到新表格:

insert into parts_new (partnum, width, length, height) 
(
    select 
     h.partnum as partnum, 
     w.measurement_value as width, 
     l.measurement_value as length, 
     h.measurement_value as height 
    from 
     parts_old as w 
    inner join 
     parts_old as l on l.partnum = w.partnum 
    inner join 
     parts_old as h on h.partnum = w.partnum 
    where 
     w.measurement_type = 'width' 
     and 
     l.measurement_type = 'length' 
     and 
     h.measurement_type = 'height'  
    group by 
     h.partnum 
) 

我使用Sequel Pro在MySQL 5.1上測試了它,以確保它能正常工作。

+0

美麗!謝謝 – Dave

+0

哎呀,其實很抱歉。 parts_new數據庫表應該是2列。所以表應該有標題「partnum」和「描述」,並在描述中,應該有:「寬度:5
長度:10
高度:5」合併成一列 – Dave

+0

我知道你正在使用繼承代碼,所以也許你沒有靈活性來輕鬆地改變這種情況,但將視覺,HTML標籤放入數據庫表的想法看起來像是一種非常脆弱的方法。如果您最終需要查詢零件並按寬度對它們進行排序會怎樣?如果有一天您需要在PDF文檔,純文本電子郵件或其他一些不使用HTML標籤的可視格式中顯示這些部分,該怎麼辦?有沒有什麼不能視覺的東西(在
標籤)分成視圖層的一個原因? (PHP/JSP/ASP/Rails ERB /無論你使用什麼。) –