连接远程SQL表,而不在它们之间拉取数据

连接远程SQL表,而不在它们之间拉取数据,sql,join,group-by,Sql,Join,Group By,我有两个远亲的mySQL表:Box和Schedule 这些表仅通过许多其他表联接关联 box具有订阅ID,订阅具有boxContent ID,而boxContent具有日程ID 许多盒子有一个订阅 一个订阅包含许多内容 许多内容都有一个时间表 我需要得到所有的时间表细节附加到箱子和分组他们的交货日期的箱子 我遇到的问题是,我无法确定如何对它们进行分组或加入它们,以便subscription和boxcontents数据不会用无效结果填充结果 例如: SELECT Box.expected

我有两个远亲的mySQL表:Box和Schedule

这些表仅通过许多其他表联接关联

box具有订阅ID,订阅具有boxContent ID,而boxContent具有日程ID

许多盒子有一个订阅 一个订阅包含许多内容 许多内容都有一个时间表

我需要得到所有的时间表细节附加到箱子和分组他们的交货日期的箱子

我遇到的问题是,我无法确定如何对它们进行分组或加入它们,以便subscription和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。

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

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

使用
DISTINCT
计算查询中的DISTINCT
框。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

类似地,当您
框与订阅表、内容表和日程表连接在一起时,您将获得许多重复项。您需要分析数据,并查看需要如何按分组

使用此查询可以在分组之前查看查询使用的实际数据,并决定按哪些列进行分组。大多数情况下,您会在多行中看到重复数据的列

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.*
,以得出最终分组


如果您需要任何更具体的答案,您必须为所有这些表和您要查找的结果提供虚拟数据

使用
DISTINCT
对查询中的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

类似地,当您
框与订阅表、内容表和日程表连接在一起时,您将获得许多重复项。您需要分析数据,并查看需要如何按分组

使用此查询可以在分组之前查看查询使用的实际数据,并决定按哪些列进行分组。大多数情况下,您会在多行中看到重复数据的列

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.*
,以得出最终分组


如果您需要任何更具体的答案,您必须为所有这些表和您要查找的结果提供虚拟数据

从两个查询中删除分组,并实际查看它们返回的行-也许您会发现重复的原因。然后,与其直接连接导致重复的表,不如使用subselect进行连接,该subselect使用
DISTINCT
或类似的方法预先消除重复。如果没有实际使用的架构,没有一些虚拟数据来填充,很难给出更具体的建议,以及您获得的所需和实际输出的示例。从两个查询中删除分组,并实际查看它们返回的行-也许您会发现重复的原因。然后,与其直接连接导致重复的表,不如使用subselect进行连接,该subselect使用
DISTINCT
或类似的方法预先消除重复。如果没有实际使用的架构,没有一些虚拟数据来填充,很难给出更具体的建议,以及您得到的期望和实际输出的示例。