@ivankirshin

Как получить данные из бд?

Мне нужно посчитать какое количество часов в сумме (number) отработал работник за выбранный период.
Нужно чтобы показывались все работники, которые есть в таблице workers. Если не отработали, то соответственно 0 часов.
SELECT w.name_worker,
w.surname_worker,
w.midname_worker,
w.id_worker,
SUM(number) numb
FROM workers w
LEFT JOIN exhours e ON (w.id_worker = e.id_worker)
LEFT JOIN orders o ON (e.id_order = o.id_order
AND o.datetime_order >= $date_start
AND o.datetime_order <= $date_end)
GROUP BY w.id_worker


Такой код не работает. При любой дате выводятся все работники и у них часы уже посчитаны за весь период.
Если перенести условие даты в where, то показываются только работающие в этот период.
Как нужно правильно сделать?
078acce80ddf4a5db2db3e5abb4154cf.JPG
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
@yaror
10 лет в мобильном телекоме
Может быть, вывести вот это:

o.datetime_order >= $date_start
AND o.datetime_order <= $date_end

из-под join'а в where?

Например, так:

SELECT w.name_worker,
w.surname_worker,
w.midname_worker,
w.id_worker,
SUM(number) numb
FROM workers w
LEFT JOIN exhours e ON (w.id_worker = e.id_worker)
LEFT JOIN orders o ON (e.id_order = o.id_order)
where
o.datetime_order >= $date_start
AND o.datetime_order <= $date_end
GROUP BY w.id_worker

Потому что сейчас получается так:
1. Будут выведены все записи таблицы Workers
2. К ним будут прицеплены _все_ записи таблицы exhours по полю id_worker
3. Также будут прицеплены записи таблицы orders, _для которых поле datetime_order попадает в указаную вилку_
Однако, поле number-то хранится в таблице exhours!

Как вариант, можно было бы сделать так:

SELECT w.name_worker,
w.surname_worker,
w.midname_worker,
w.id_worker,
SUM(h.number) numb
FROM
workers w
left join
(select e.id_worker, e.number from
exhours e inner join orders o on e.id_order = o.id_order
where o.datetime_order >= $date_start
AND o.datetime_order <= $date_end) h
on w.id_worker = h.id_worker
GROUP BY w.id_worker
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы