使用来自连接查询的字段值作为列
问题描述:
我有两个MySQL表格,描述可以扩展到子类的数据,一个描述父类数据,另一个描述元数据字段为一对多关系。从表使用来自连接查询的字段值作为列
实例行页:从表
id | name
-----+-----------------------
123 | Example page
999 | Another page
实例行page_metadata:
page_id | key | value
--------+------------+----------------
123 | picture | test.jpg
123 | video | example.avi
123 | sound | sound.mp3
999 | picture | something.jpg
问:是否有某种方式以这种形式来获取所有数据?
id | name | picture | video | sound
-----+------------------+---------------+-------------+------------------
123 | Example page | test.jpg | example.avi | sound.mp3
999 | Another page | something.jpg | NULL | NULL
答
SELECT pm.page_id as id
, p.name
, max(IF(pm.key = 'picture', pm.value, null)) as picture
, max(IF(pm.key = 'video', pm.value, null)) as video
, max(IF(pm.key = 'sound', pm.value, null)) as sound
FROM page p
INNER JOIN page_metadata pm ON (p.id = pm.page_id)
GROUP BY p.id
+0
是的,这已经足够了。我只是将'INNER'改为'LEFT',以包含没有附加任何元数据的页面。谢谢! – Kaivosukeltaja 2011-06-09 11:26:12
答
尝试
SELECT page.id, page.name, picture.value, video.value, sound.value
FROM page
LEFT OUTER JOIN (SELECT page_id, value FROM page_metadata WHERE key = 'picture') as picture
ON page.id = picture.page_id
LEFT OUTER JOIN (SELECT page_id, value FROM page_metadata WHERE key = 'video') as video
ON page.id = video.page_id
LEFT OUTER JOIN (SELECT page_id, value FROM page_metadata WHERE key = 'sound') as sound
ON page.id = sound.page_id
应该得到你所需要的
查找 - 在MySQL中的数据透视表。 – Devart 2011-06-09 11:10:58