Нет, в общем случае условие Having
используется для фильтрации результатов вашего Group by
- например, для отчета только о тех, кому заплатили более 24 часов в день (HAVING SUM(ramses.timesheet_detail.paidTime) > 24
).Если вам не нужно выполнять фильтрацию агрегированных результатов, вам вообще не понадобится предложение having
.
Большинство этих условий следует перенести в предложение where
или как часть объединений по двум причинам.- 1) Как правило, фильтрация должна выполняться как можно скорее, чтобы ограничить работу, которую должен выполнить запрос.2) Если фильтрация уже выполнена, ее повторный запуск может привести к тому, что запрос выполнит дополнительную, ненужную работу.
Из того, что я видел до сих пор, кажется, что вы пытаетесь свернуть все по дням - попробуйтеизменив последний столбец в предложении group by
на date(ramses.batch_log.start_time)
, или вы группируете по (что я предполагаю) метке времени.
РЕДАКТИРОВАТЬ:
Об именах схем - да, вы можете назвать их в разделах from
и join
.Часто запрос также может разрешить необходимые схемы на основе какого-либо списка поиска по умолчанию (как или если это настроено, зависит от вашей базы данных).
Вот как я бы переформатировал запрос:
SELECT tblusers.userid, operations.name AS name,
SUM(TIME_TO_SEC(batch_log.time_elapsed)) AS time_elapsed,
SUM(tasks.estimated_nonrecurring + tasks.estimated_recurring) AS total_estimated,
SUM(timesheet_detail.paidTime) as hours_paid,
DATE(start_time) as date_paid
FROM tblusers
JOIN batch_log
ON tblusers.userid = batch_log.userid
AND DATE(batch_log.start_time) >= "2011-01-01"
JOIN batches
ON batch_log.batch_id = batches.id
JOIN operations
ON operations.id = batches.operation_id
JOIN tasks
ON batches.id = tasks.batch_id
JOIN timesheet_detail
ON tblusers.userid = timesheet_detail.userid
AND batch_log.start_time = timesheet_detail.for_day
AND DATE(timesheet_detail.for_day) = DATE(start_time)
WHERE tblusers.departmentid = 8
GROUP BY tblusers.userid, name, DATE(batch_log.start_time)
ORDER BY date_paid ASC
Особую озабоченность вызывает линия batch_log.start_time = timesheet_detail.for_day
, которая сравнивает (что подразумевается под) временные метки.Они действительно равны?Я ожидаю, что один или оба из них должны быть заключены в функцию date()
.
Что касается того, почему вы можете получать неожиданные данные - вы, похоже, устранили некоторые из ваших условий соединения.Не зная точной настройки и использования вашей базы данных, я не могу назвать точную причину ваших результатов (или даже могу сказать, что они неверны), но я думаю, что тот факт, что вы присоединяетесь к таблице operations
без каких-либо join
возможно, виновато условие - если в этой таблице 2 записи, это удвоит все ваши предыдущие результаты, и похоже, что их может быть 12. Вы также удалили operations.name
из предложения group by
, что может или можетне дать вам результаты, которые вы хотите.Я бы посмотрел на остальные ваши взаимоотношения за столом и выяснил, есть ли какие-то дополнительные ограничения, которые необходимо сделать.