Я пишу C не Java, но это должно работать в любом случае. Я использую remote debug - определите «удаленное» соединение с LOCALHOST, которое позволяет указать пользователя, с которым вы будете подключаться, указать ROOT. Затем определите удаленное приложение в подключении конфигурации отладки: LOCALHOST. Обязательно проверьте «пропустить загрузку до целевого пути» в нижней части основной вкладки, а также в окне свойств подключения.
"[ 1127] работники «таблица имеет отношение 1: N к« order_status ».
Также « работники » имеют отношение 1: N к болезни, на самом деле это не имеет значения, даже если это 1: 1 . [ 1115]
Запрос создает декартово произведение между вышеуказанными таблицами и дубликатов значений столбцов из каждой таблицы может быть в наборе результатов запроса выше.
Удалите group by
и sum
, чтобы увидеть набор результатов.
Например, в вашем примере для id_worker 25 у вас есть 3 строки order_status, соединенные с 1 строкой болезни (значения этой строки будут продублированы 3 раза), объединенные с 1 строкой рабочих (снова они будут продублированы 3 раза), с 1 заказами строка (такая же).
Таким образом, агрегатная функция sum
объединяет повторяющиеся значения.
Это работало бы, только если результирующий набор содержал уникальные строки для всех столбцов, используемых для агрегатных функций
Чтобы решить эту проблему, используйте подзапросы для агрегирования результатов:
SELECT workers.fname,
workers.lname,
order_statusAgg.number_order,
workers.id_worker,
order_statusAgg.desc_order,
SEC_TO_TIME(SUM(order_statusAgg.stime)) AS 'TOTAL TIME',
SEC_TO_TIME(SUM(sicknessAgg.stime)) AS 'SICKNESS TIME'
FROM workers
INNER JOIN (
SELECT sickness.id_worker, SUM((Time_to_sec(sickness.end_date) -
Time_to_sec(sickness.begin_date))) AS stime
FROM sickness
GROUP BY sickness.id_worker
) sicknessAgg
ON sicknessAgg.id_worker = workers.id_worker
INNER JOIN (
SELECT order_status.id_worker, orders.number_order, orders.desc_order, SUM((Time_to_sec(order_status.end_date) -
Time_to_sec(order_status.begin_date))) AS stime
FROM order_status
INNER JOIN orders
ON orders.id_order = order_status.id_order
GROUP BY order_status.id_worker
) order_statusAgg
ON workers.id_worker = order_statusAgg.id_worker
WHERE order_statusAgg.number_order LIKE 'TEST'
GROUP BY workers.id_worker
Обратите внимание, что в этом случае необходимо начинать с таблицы worker , так как вы хотите агрегировать различное количество строк из таблиц order_status
и sickness
.
Ссылки:
Как объединить три таблицы, чтобы получить Sum
MySQL JOIN с несколькими таблицами и SUMS
Как получить сумму двух таблиц, используя внутреннее объединение