Я пытаюсь присоединиться к таблице сотрудников «сотрудники», таблице транзакций 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
Я скопировал этот код из phpmyadmin, поэтому он имеет «вокруг всех имен таблиц и столбцов». – David
'hta' и' transaction' (предположительно) имеют по несколько рядов на одного сотрудника. Следовательно, вы получаете декартовую продукцию для каждого сотрудника, а резюме - все. –
Я добавил несколько дополнительных сложных запросов, которые я попытался без везения. Некоторые примеры или конкретные предложения были бы замечательными. Сегодня я был в этом вопросе на 8 часов. Да, обе эти таблицы могут иметь несколько транзакций при просмотре более одного дня за раз. – David