Zum Drehen die Daten in MySQL, müssen Sie sowohl eine Aggregatfunktion als auch einen CASE
verwenden Ausdruck.
Wenn Sie eine bekannte Anzahl von Spalten haben, können Sie die Abfrage fest codieren:
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;
Siehe SQL-Fiddle mit Demo
Wenn Sie jedoch eine unbekannte Anzahl von Spalten haben, müssen Sie eine vorbereitete Anweisung verwenden, um dynamisches SQL zu generieren:
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;
Siehe SQL-Fiddle mit Demo .
Beide liefern das Ergebnis:
| POSTID | INCIDENT | LOCATION | WEAPON |
----------------------------------------------
| 1 | Murder | New Brunswick | (null) |
| 2 | Theft | (null) | Gun |