1113 Это действительно ожидается. Вышеупомянутый запрос объединяет 4 таблицы:
"[ 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
Как получить сумму двух таблиц, используя внутреннее объединение
Если Вы ищете шаблон после того, как Вы будете иметь: vimgrep'd это, Vim выделит его. Просто отредактируйте :vimgrep pattern files
в :g/pattern/
.
Для более богатого решения попробуйте этот сценарий.
Можно использовать Unix grep:
:!grep --color pattern %
Могут быть другие решения с помощью внутреннего grep/vimgrep, но этих работ для меня.
Два пути:
/
можно использовать :set hls
.:match Search /pattern/
. Это выделит все, что соответствует pattern
.