你所要求的基本上是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
所有版本會給你相同的結果。
如果您檢查數據透視標籤,則存在許多以前存在的問題。 –
而不是直接使用單個查詢,您可以使用過程。 –
你想要這個數據在單列還是多列? – Taryn