2013-05-30 44 views
0

我有一個表格,它是填充到表單中的所有信息的巨大列表。每個表單條目將所有信息放入同一列,另外一列用於field_id(這使我可以準確知道信息輸入的位置)。因此,如果表單有8個輸入字段,則輸入的所有信息將位於一列中,並且與輸入字段相對應的field_id位於另一個字段中。MySQL - 如何將一個表中不同行的信息合併到另一個表中的單個行中?

我現在正在重建數據庫,使這個系統的混亂更有用,但我需要保留所有以前輸入的數據。基於field_id列,如何將信息輸入到8行的信息合併到新表中的單個行中?

因此,如果姓名/地址/電話/電子郵件/傳真/母親/父親/寵物是新表的列,但其中每一個的信息都存儲在原始表中的單個列中,並且field_ids爲1到8在另一欄中,我怎麼能這樣做呢?

編輯:更清晰

表1結構: ID/meta_value/FIELD_ID/entry_id/CREATED_DATE

表2結構: ID /名稱/地址/電話/電子郵件/傳真/媽媽/爸爸/寵物

+0

你能發佈兩個表的結構? 'field_id'將標識列,但是您的問題沒有提及標識* rows *的內容。換句話說,必須有一個將8行聯繫在一起的值。 –

+0

這8行通過entry_id綁定在一起。所以每一組8行都有獨特的一個。 如何張貼每個數據庫的結構? – Sw1sh

+0

下面的兩個答案都會將8行轉爲單行。你必須根據實際的表名和列名來修改它們。如果您在跳躍時遇到困難並需要基於您自己的表的示例,那麼只需編輯您的問題並添加諸如「TableA具有列entry_id,field_id,field_value和TableB具有此列,即其他列」的內容。這足以繼續下去。 –

回答

2

你可以用MAXCASE來做到這一點。不知道你的表結構,我只舉一個例子:

SELECT id, 
    MAX(CASE WHEN field_id = 1 THEN meta_value END) 'Name', 
    MAX(CASE WHEN field_id = 2 THEN meta_value END) 'Address', 
    MAX(CASE WHEN field_id = 3 THEN meta_value END) 'Phone', 
    ... 
FROM YourTable 
GROUP BY id 

這將PIVOT你的結果爲單行多列。

+0

如果我想插入到另一個表中的這一行,我會開始使用INSERT INTO table2 SELECT blahblahblah ...? – Sw1sh

+0

@ Sw1sh - 你的其他表是否存在?如果是這樣,那麼是的,你可以使用INSERT INTO ...給它一個鏡頭,讓我知道如果你遇到任何問題。最好的祝福! – sgeddes

+0

是的,它已經存在並創建了。我現在要給它一個重擊,我會回來讓你知道。 – Sw1sh

1

好吧,如果我理解正確的,你可以這樣做:

select 
    id, 
    (select meta_value from Table1 t2 where field_id = 1 and t2.id = t1.id) as name, 
    (select meta_value from Table1 t2 where field_id = 2 and t2.id = t1.id) as address, 
    ... 
    (select meta_value from Table1 t2 where field_id = 8 and t2.id = t1.id) as pet 
from Table1 t1 
group by id 
相關問題