[英]Joining data from a table that is identified by another table
我被要求把一个小的报告系统放在一起工作。 我们有一个数据库,用户在其中提交信息,即各种事件的开始时间和停止时间。
如您所见,事件有一个子类别,每个子类别都属于一个类别。
我被要求制作一张图表,该图表代表给定日期范围内给定类别事件发生的总时间。
因此,例如:
Category Name | Total time
**************************
Balloons | 12h
Chalk | 5.5h
我正在努力从join语句中获取一笔款项。 如您所见,为了将总时间映射到各种类别,我必须首先确定哪些子类别属于哪些类别,然后相应地组织事件。
我承认,在编写单个查询而不是编写存储过程或创建临时表时,我一直很固执。 我坚信仅通过联接就可以完成任务,但事实并非如此。 我完全接受任何可行的解决方案
一个要求; 如果给定类别没有事件,则它应仍出现在结果中,仅默认值为0。
这是我到目前为止的内容:
SELECT
event_categories.name,
SUM(TIMESTAMPDIFF(MINUTE,
events.start,
events.stop) / 60) AS timeLost
FROM
events
LEFT JOIN
event_subcategories ON event_subcategories.id = events.subcategory
RIGHT JOIN
event_categories ON event_categories.id = event_subcategories.id
WHERE
events.date BETWEEN '2016-12-01' AND '2016-12-22'
AND events.bed = 1
GROUP BY event_categories.id;
它几乎可以正常工作,可以产生带有相关时间损失的类别列表。 只是它不会显示所有类别,而只会显示与事件相关联的类别。
更改执行联接的方式。 主表应为event_categories
。 假设每个类别都有子类别,则可以将INNER JOIN
与event_subcategories
一起event_subcategories
。 最后,将LEFT JOIN
与events
,因为某些子类别可能没有任何事件。
您还在错误的列上加入了event_categories
和event_subcategories
。 它应该是event_subcategories.category
,而不是event_subcategory.id
。
当您执行LEFT JOIN
,子表上的任何条件都应该在ON
子句中,而不是WHERE
。 因为没有事件的任何类别的所有event
列都将为NULL
,所以这些行的条件将永远不会成功,并且它们将像执行INNER JOIN
一样被过滤掉。
SELECT
c.name,
SUM(TIMESTAMPDIFF(MINUTE,
e.start,
e.stop) / 60) AS timeLost
FROM event_categories AS c
JOIN event_subcategories AS s ON s.category = c.id
LEFT JOIN events AS e ON e.subcategory = s.id
AND e.date BETWEEN '2016-12-01' AND '2016-12-22'
AND e.bed = 1
GROUP BY c.id;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.