从多个连接表创建一个结果集;列由查找表组成

时间:2010-11-16 22:31:36

标签: sql mysql

是否有人知道是否可以根据下表编写可以产生以下输出的查询?

我设法通过创建三个单独的查询并将先前查询的结果集传递到下一个查询来创建以下结果。但我希望有一种更有效的方式。

如果可能,我想使用ONE SQL输出此内容吗?

          baseball  computer  laptop
Jane Doe  5                  
Joe Blogs           8         8

这些是我必须使用的表格:

人员表

id    first_name  last_name
101   Jane        Doe
576   Joe         Blogs

爱好表

id hobby_type   hours_spent
1  sports       5
2  technology   8

hobby_types表

id name
33 computer
39 baseball
45 laptop

people_hobbies人与爱好的联合表

id person_id hobby_id
1  101      1
3  576      1
2  576      2

hobbies_hobby_types爱好和爱好_types的连接表

hobby_id hobby_type_id 
1        39
2        33
3        45

2 个答案:

答案 0 :(得分:2)

您正试图获得所谓的pivot table

我担心在MySQL中无法使用无限数量的列进行此操作,但也许我错了。使用新学习的关键字可以找到有关此主题的大量信息。

答案 1 :(得分:1)

正如AndreKR所说,你不能在MySQL的单个选择中使用无限数量的列来执行此操作,但如果事先知道列值,那么您可以使用如下查询来执行此操作:

select person_name,
       sum(case hobby_type when 'baseball' then hours_spent else 0 end) baseball,
       sum(case hobby_type when 'computer' then hours_spent else 0 end) computer,
       sum(case hobby_type when 'laptop' then hours_spent else 0 end)   laptop
from
(select p.first_name + ' ' + p.last_name person_name,
        ht.name                          hobby_type,
        h.hours_spent
 from persons p
 join persons_hobbies ph on p.id = ph.person_id
 join hobbies h on ph.hobby_id = h.id
 join hobbies_hobby_types hht on h.id = hht.hobby_id
 join hobby_types ht on hht.hobby_type_id = ht.id) sq
group by person_name

顺便说一句,如果数据库中的表结构与示例中的表结构远程相似,则应认真重新考虑它们。花费的时间通常会分配在人 - 爱好加入级别 - 在这里,看起来好像你花了每个爱好花费的总时间并将所有这些花费分配给每个人,导致严重的过度计数。类似的问题也适用于Hobby-Types to Hobbies关系。