Để xoay vòng dữ liệu trong MySQL, bạn sẽ cần sử dụng cả hàm tổng hợp và CASE
biểu thức.
Nếu bạn có một số cột đã biết, thì bạn có thể viết mã cố định cho truy vấn:
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;
Nhưng nếu bạn có một số lượng cột không xác định, thì bạn sẽ cần sử dụng một câu lệnh đã chuẩn bị để tạo SQL động:
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;
Xem SQL Fiddle với Demo .
Cả hai sẽ cho kết quả:
| POSTID | INCIDENT | LOCATION | WEAPON |
----------------------------------------------
| 1 | Murder | New Brunswick | (null) |
| 2 | Theft | (null) | Gun |