2011-06-09 152 views
1

我有两个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 
+0

查找 - 在MySQL中的数据透视表。 – Devart 2011-06-09 11:10:58

回答

1
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

0

尝试

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 

应该得到你所需要的

相关问题