繁体   English   中英

连接另一个表标识的表中的数据

[英]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 JOINevent_subcategories一起event_subcategories 最后,将LEFT JOINevents ,因为某些子类别可能没有任何事件。

您还在错误的列上加入了event_categoriesevent_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM