【问题标题】:If the where condition is on a joined table, will I get duplicated results?如果 where 条件在连接表上,我会得到重复的结果吗?
【发布时间】:2011-09-23 13:27:24
【问题描述】:

我有三张表,一张是工厂工人分批完成的任务,另一张表,每个任务都有一个batch_id,多个任务可以有相同的batch_id。第三个表是 batch_log,其中以唯一 id、batch_id、人的用户 ID、start_time 和 end_time 的形式记录了某人处理批次的所有时间。

每个任务都有一个以秒为单位的estimate_recurring 时间和一个以秒为单位的estimate_nonrecurring 时间。我正在寻找按 operation_id 分组的这两个字段的总和,它是任务表中的一个字段,表示它是否是激光切割、去毛刺、绘画等任务。

问题是我只想要在 time_period 期间在 batch_log 中具有批处理的任务。批次在 batch_log 表中有多个条目。

这是我正在尝试的:

SELECT 
  operation_id, SUM(t.estimated_nonrecurring + t.estimated_recurring) / 3600 as work_completed
FROM tasks t
INNER JOIN batch_log l on t.batch_id = l.batch_id
WHERE 
  l.start_time BETWEEN DATE("10:00:00") AND DATE(NOW())
AND
  l.time_elapsed < "10:00:00"
GROUP BY t.operation_id

我担心我会得到比实际更高的估计值,因为任务表中的多个条目可能具有相同的批次。

【问题讨论】:

  • 需要更多信息,什么是多任务,给我们一些示例数据。今天的问题是怎么回事? TGIF
  • 感谢乔恩,回复,我已经更新了描述,我应该发布什么样的数据?
  • 您的解决方案直接进入任务表,而不考虑批处理表中的批次。您需要加入任务->批处理->批处理日志。请参阅下面的解决方案。

标签: mysql join sum duplication


【解决方案1】:

因为您只想要基于批处理日志文件中任务的时间,所以您发布的内容肯定行不通。

假设您有 3 个表:Tasks、Batches 和 BatchLog。

你会想要这个:

SELECT
      SUM(t.estimated_nonrecurring + t.estimated_recurring) / 3600 as work_completed,
      t.OperationID
FROM
      Tasks t
INNER JOIN
       Batches b
ON
       b.BatchID = t.BatchID
INNER JOIN
       BatchLog bl
ON
       bl.BatchID = b.BatchID
WHERE  
  bl.start_time BETWEEN DATE("2011-08-01") AND DATE(NOW())
GROUP BY
       t.OperationID

【讨论】:

  • 这真的很有帮助。如果我从任务表开始,我不应该在 t.batch_id = b.id 上加入 b.id 吗?或者有什么不同。编辑:显然没有,刚刚检查过。
  • @dah - 你拥有表格而不是我:),你拥有业务逻辑而不是我:),我只是根据我对你的结构知之甚少来回答。我将它读为 3 个表:任务、批处理和批处理日志。任务可以属于同一个批次。这是任务->批次之间的一对多关系。您获得该连接以确保您拥有至少有一批的适当任务。但是随后您必须将其更进一步,以仅获取已记录的批次(内部连接批次-> batch_log)。你的评论说shoundt I join b.id on t.batch_id = b.id...记住我没有
  • ...继续:表结构,所以我使用的是我组成的列。我所做的就是使用铅笔和纸并放置一些示例数据并创建箭头来建立关系。如果存在箭头,则需要某种连接。如果你想要一个必须有一个批处理日志的任务,你知道你需要某种内部连接(没有左连接,就像你使用左连接一样,你会得到一个没有批处理日志的任务)。
  • 非常感谢 Jon,我从这个查询中得到的结果要好得多。
  • 所以是批处理表使答案保持理智,因为您最终不会得到每个日志的结果,而是每个批处理的结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 2012-10-27
  • 2020-09-18
  • 2016-11-29
  • 2022-11-10
  • 1970-01-01
相关资源
最近更新 更多