0

我有两个密切相关的 mySQL 表:Box 和 Schedule。

这些表仅通过许多其他表连接相关。

一个盒子有一个订阅 ID,一个订阅有一个盒子内容 ID,一个盒子内容有一个计划 ID。

许多盒子有一个订阅 一个订阅有很多 boxContents 许多 boxContents 有一个 Schedule

我需要获取附加到盒子的所有时间表详细信息,并按盒子的交货日期对它们进行分组。

我遇到的问题是,我无法弄清楚如何对它们进行分组或加入它们,以便订阅和 boxcontents 数据不会用无效结果填充结果。

例如:

SELECT 
    Box.expected_delivery_date, count(Box.id) num_boxes
FROM
    Box

WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

返回我需要查找的正确数量的框:

2010-10-01 - 2
2010-10-07 - 4

但是,当我包含需要将两者链接在一起的表时,我得到的所有数据都会混淆结果

SELECT 
    Box.expected_delivery_date, count(Box.id) num_boxes
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

回报:

2010-10-01 - 10
2010-10-07 - 17

我确信有一种简单的方法可以做到这一点,我只是不擅长 SQL。

4

2 回答 2

2

用于DISTINCT计算Box.id查询中的不同 -

SELECT 
    Box.expected_delivery_date, count(DISTINCT Box.id) num_boxes
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2
GROUP BY Box.expected_delivery_date;

这应该返回

2010-10-01 - 2
2010-10-07 - 4

同样,当您JOIN将订阅、内容、日程表装箱时,您将获得许多重复项。你需要分析数据,看看你需要怎么做GROUP BY

使用此查询可在分组前查看查询使用的实际数据,并决定分组依据的列。大多数情况下,它将是您在多行中看到重复数据的列。

SELECT 
    Box.expected_delivery_date, Box.id BoxID, Schedule.id SchID
FROM
    Box
        JOIN
    Subscription ON Box.subscription_id = Subscription.id
        JOIN
    BoxContent ON Subscription.id = BoxContent.subscription_id
        JOIN
    Schedule ON Schedule.id = BoxContent.schedule_id
WHERE
    Box.state = 3 AND Box.status = 2

您甚至可以尝试SELECT Box.*, Schedule.*在上述查询中得出最终分组。

如果您需要任何更具体的答案,您必须提供所有这些表的虚拟数据以及您正在寻找的结果。

于 2013-09-17T14:55:46.537 回答
1

我会同意这些评论并尝试使用DISTINCT. 这应该通过加入“中间”表过滤掉您将获得的重复行。

于 2013-09-17T14:55:28.877 回答