为了 转动 在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) Weaponfrom triples pleft join tags t on p.tagid = t.idgroup by p.postid;
参见带有演示的SQL Fiddle
但是,如果您的列数未知,则需要使用一条准备好的语句来生成动态SQL:
SET @sql = NULL;SELECt GROUP_CONCAt(DISTINCT CONCAt( 'max(CASE WHEN TagName = ''', TagName, ''' THEN p.value END) AS `', TagName, '`' ) ) INTO @sqlFROM tags;SET @sql = CONCAt('SELECt p.postid, ', @sql, ' from triples pleft join tags t on p.tagid = t.idgroup by p.postid');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;请参阅带有演示的SQL Fiddle。
两者都会给出结果:
| POSTID | INCIDENT | LOCATION | WEAPON |----------------------------------------------| 1 | Murder | New Brunswick | (null) || 2 | Theft | (null) | Gun |



