2015-08-16 3 views
0

Я пытаюсь присоединиться к таблице сотрудников «сотрудники», таблице транзакций timeclock «транзакции» и другой таблице «hta» с полем времени. Я хочу, чтобы таблица timeclock добавила время, в течение которого сотрудник работал между несколькими днями. Я хочу, чтобы другая таблица «hta» добавляла время для каждого сотрудника между несколькими днями и смотрела на таблицу сотрудников, чтобы получить имя сотрудников. Чтобы сделать все просто сейчас, я работаю только один день. Поэтому на одного сотрудника есть только одна запись. В этот день никто не пробовал много раз. В таблице hta есть несколько записей на человека за день.Mysql объединяет 3 таблицы с несколькими полями

Вот мой код

SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(`t`.`hours_today`))) , "%H:%i:%s") 
AS `hours_today` , 
TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(`h`.`run_time`))) , "%H:%i:%s") 
AS `run_time` , 
`t`.`employee_id` , `e`.`employee_id` , `e`.`displayname` 
FROM `transactions` t LEFT JOIN `hta` h 
ON `t`.`employee_id` = `h`.`employee_id` 
AND `t`.`date` = `h`.`date` 
LEFT JOIN `employees` e on `t`.`employee_id` = `e`.`employee_id` 
WHERE `t`.`date` >= "2015-08-14" 
AND `t`.`date` <= "2015-08-14" 
GROUP BY `t`.`employee_id` 
ORDER BY `t`.`employee_id` ASC 

Выход я получаю hours_today неправильно, run_time правильно, employee_id правильно, и отображаемое имя правильно.
На сотрудника 1 час_отчет должен быть 05:48:00. Помните, что у сотрудника только одна запись в столбце hours_today для этого диапазона дат. Однако вывод mysql для этого сотрудника - 29:00:00. Таким образом, похоже, что дата таблицы timeclock не ограничена, как и для таблицы hta. Сотрудник 2 hours_today должно быть 9:34:00, но на выходе из запроса 95:40:00

Я попытался более точный код, такой как

SELECT TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(t.hours_today))), 
"%H:%i:%s") as hours_today, t.employee_id, e.employee_id, e.displayname FROM transactions t 
LEFT JOIN employees e ON t.employee_id = e.employee_id LEFT JOIN (SELECT employee_id, 
TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(run_time))), "%H:%i:%s") as run_time FROM hta WHERE 
DATE(date_time) >= "2015-08-14" AND DATE(date_time) <= "2015-08-14" GROUP BY employee_id) hta 
on e.employee_id = hta.employee_id LEFT JOIN hta h on hta.employee_id = h.employee_id WHERE 
date >= "2015-08-14" AND date <= "2015-08-14" GROUP BY t.employee_id ORDER BY t.employee_id 
ASC 

и

SELECT TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(t.hours_today))), "%H:%i:%s") 
as hours_today, TIME_FORMAT(SEC_TO_TIME(sum(TIME_TO_SEC(h.run_time))), "%H:%i:%s") as 
run_time, t.employee_id, e.employee_id, e.displayname FROM transactions t LEFT JOIN 
employees e ON t.employee_id = e.employee_id LEFT JOIN hta h on e.employee_id = h.employee_id 
and t.date = DATE(h.date_time) WHERE date >= "2015-08-14" AND date <= "2015-08-14" 
GROUP BY t.employee_id ORDER BY t.employee_id ASC 
+0

Я скопировал этот код из phpmyadmin, поэтому он имеет «вокруг всех имен таблиц и столбцов». – David

+0

'hta' и' transaction' (предположительно) имеют по несколько рядов на одного сотрудника. Следовательно, вы получаете декартовую продукцию для каждого сотрудника, а резюме - все. –

+0

Я добавил несколько дополнительных сложных запросов, которые я попытался без везения. Некоторые примеры или конкретные предложения были бы замечательными. Сегодня я был в этом вопросе на 8 часов. Да, обе эти таблицы могут иметь несколько транзакций при просмотре более одного дня за раз. – David

ответ

0

После много разочарований ....

SELECT `t1`.`displayname`, `t1`.`employee_id`, `t2`.`hours_today`, `t3`.`run_times` FROM 
(SELECT `employee_id`, `displayname`, `rate` FROM `employees`) t1 LEFT JOIN 
(SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(`hours_today`))) , "%H:%i:%s") AS hours_today, `employee_id` 
FROM `transactions` WHERE `date` = "2015-08-14" GROUP BY `employee_id`) t2 ON `t1`.`employee_id` = `t2`.`employee_id` 
LEFT JOIN 
(SELECT TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(`run_time`))) , "%H:%i:%s") AS run_times, `employee_id` 
FROM `hta` WHERE `date` = "2015-08-14" GROUP BY `employee_id`) t3 ON `t1`.`employee_id` = `t3`.`employee_id` 
Смежные вопросы