不,一般来说,一个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
子句中删除了,这可能会或可能不会给您想要的结果。我会调查您的其他表格关系,看看是否需要进一步限制。