是否有人知道是否可以根据下表编写可以产生以下输出的查询?
我设法通过创建三个单独的查询并将先前查询的结果集传递到下一个查询来创建以下结果。但我希望有一种更有效的方式。
如果可能,我想使用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
答案 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关系。