Если условие где находится в объединенной таблице, получу ли я дублированные результаты? - PullRequest
0 голосов
/ 23 сентября 2011

У меня есть три таблицы, одна из них - это задачи, которые фабричные рабочие выполняют, помещая их в пакеты, то есть другую таблицу, каждая задача имеет batch_id, у нескольких задач может быть один и тот же batch_id.Третья таблица - это batch_log, в котором все время, когда кто-то работал с пакетом, записывается в форме уникального идентификатора, batch_id, идентификатора пользователя, start_time и end_time.

Каждое задание имеет расчетное время повторения в секундах и примерное время повторения в секундах.Я рассчитываю получить сумму обоих полей, сгруппированных по параметру operation_id, который является полем в таблице задач, чтобы определить, является ли это задачей лазерной резки, заусенца, рисования и т. Д.

Проблема заключается в том,что я хочу только те задачи, у которых есть пакеты, которые были в 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

Я обеспокоен тем, что получу более высокую оценку, чем реально, поскольку несколько записей втаблица задач может иметь одну и ту же партию.

1 Ответ

1 голос
/ 23 сентября 2011

Поскольку вы хотите, чтобы время, основанное только на задачах, которые были в вашем файле журнала пакетов, то, что вы опубликовали, определенно не будет работать.

Предполагается, что у вас есть 3 таблицы: Задачи, Пакеты и 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
...