爲了樞在MySQL中的數據,您需要同時使用聚合函數和CASE
表達。
如果你有一個已知的列數,那麼你可以硬編碼查詢:
select p.postid,
max(case when t.tagname = 'Incident' then p.value end) Incident,
max(case when t.tagname = 'Location' then p.value end) Location,
max(case when t.tagname = 'Weapon' then p.value end) Weapon
from triples p
left join tags t
on p.tagid = t.id
group by p.postid;
見SQL Fiddle with Demo
但是,如果你有一個未知的列數,那麼你就需要使用準備好的語句生成動態SQL:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(CASE WHEN TagName = ''',
TagName,
''' THEN p.value END) AS `',
TagName, '`'
)
) INTO @sql
FROM tags;
SET @sql
= CONCAT('SELECT p.postid, ', @sql, '
from triples p
left join tags t
on p.tagid = t.id
group by p.postid');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
請參閱SQL Fiddle with Demo。
雙方將給出結果:
| POSTID | INCIDENT | LOCATION | WEAPON |
----------------------------------------------
| 1 | Murder | New Brunswick | (null) |
| 2 | Theft | (null) | Gun |
SQLFiddle(http://sqlfiddle.com)是檢驗思想的巨大資源。 – 2013-03-19 21:21:38
可能重複的[MySQL數據透視列到動態列數](http://stackoverflow.com/questions/12004603/mysql-pivot-row-into-dynamic-number-of-columns) – RichardTheKiwi 2013-05-03 09:16:02