2012-12-05 74 views
0

我無法弄清楚這一點。MySQL - 從列中創建一條記錄

我有這個表:

id component_id  data 
1  1    [email protected] 
1  2    firstname1 
1  3    lastname1 
1  4    phone1 
2  1    email2 
2  2    firstname2 
2  3    lastname2 
2  4    phone2 

現在我想有一個查詢,將根據ID中提取全部數據。我想有這些記錄:

1 [email protected] firstname1 lastname1 phone1 
2 email2 firstname2 lastname2 phone2 

我希望我理解....

+0

如果您檢查數據透視標籤,則存在許多以前存在的問題。 –

+0

而不是直接使用單個查詢,您可以使用過程。 –

+0

你想要這個數據在單列還是多列? – Taryn

回答

2

你所要求的基本上是PIVOT,但MySQL不具有旋轉功能讓您可以複製此使用具有聚合函數的CASE語句。

如果你知道的值,那麼你可以硬編碼類似這樣的解決方案:

select id, 
    max(case when component_id = 1 then data end) Email, 
    max(case when component_id = 2 then data end) Firstname, 
    max(case when component_id = 3 then data end) Lastname, 
    max(case when component_id = 4 then data end) Phone 
from yourtable 
group by id; 

SQL Fiddle with Demo

結果是:

| ID |   EMAIL | FIRSTNAME | LASTNAME | PHONE | 
----------------------------------------------------------- 
| 1 | [email protected] | firstname1 | lastname1 | phone1 | 
| 2 |   email2 | firstname2 | lastname2 | phone2 | 

我猜測您有一張表將component_id與名稱相關聯,因此您的查詢也可以是:

select t1.id, 
    max(case when t2.name = 'email' then data end) Email, 
    max(case when t2.name= 'FirstName' then data end) Firstname, 
    max(case when t2.name= 'LastName' then data end) Lastname, 
    max(case when t2.name= 'phone' then data end) Phone 
from yourtable t1 
inner join component t2 
    on t1.component_id = t2.id 
group by t1.id; 

SQL Fiddle with Demo

如果你有一個未知的數值,那麼你可以使用準備好的語句來生成動態此查詢:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(case when name = ''', 
     name, 
     ''' then data end) AS ', 
     name 
    ) 
) INTO @sql 
FROM component; 

SET @sql = CONCAT('SELECT t1.id, ', @sql, ' 
        from yourtable t1 
        inner join component t2 
        on t1.component_id = t2.id 
        group by t1.id'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SQL Fiddle with Demo

所有版本會給你相同的結果。

相關問題