如何将一个表连接到userid = userid的另一个表,但仅限于该日期?

时间:2011-06-29 16:48:03

标签: mysql sql group-by having having-clause

我希望用户在他的工作站上处理每个批次的总时间,完成的总估计工作量,用户支付的金额以及用户今年每天的失败次数。如果我可以将所有这些加入到一个查询中,那么我可以在excel中使用它并在数据透视表等中很好地格式化。

编辑:我意识到只有在多个查询中才能这样做,所以我将范围缩小到这个范围:

SELECT batch_log.userid,
batches.operation_id,
SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)),
SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring),
DATE(start_time)
FROM batch_log
JOIN batches ON batch_log.batch_id=batches.id
JOIN ramses.tasks   ON ramses.batch_log.batch_id=ramses.tasks.batch_id
JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid
WHERE DATE(ramses.batch_log.start_time) > "2011-01-01"
AND protocase.tblusers.active = 1
GROUP BY userid, batches.operation_id, start_time
ORDER BY start_time, userid ASC

交叉连接导致了问题。

1 个答案:

答案 0 :(得分:1)

不,通常情况下,Having子句用于过滤Group by的结果 - 例如,仅报告一天内付款超过24小时的人({{1} })。除非您需要对聚合结果进行过滤,否则根本不需要HAVING SUM(ramses.timesheet_detail.paidTime) > 24条款 这些条件中的大多数应该移动到having子句中,或者作为连接的一部分,有两个原因 - 1)过滤通常应该尽快完成,以限制查询需要执行的工作。 2)如果过滤已经完成,重新进行过滤可能会导致查询执行额外的,不需要的工作 从我到目前为止看到的情况来看,您似乎正在尝试在当天进行推广 - 尝试将where子句中的最后一列更改为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()表而没有任何{{ {1}}条件可能是罪魁祸首 - 如果该表中有2条记录,它会使您之前的所有结果加倍,看起来可能有12条。您还从{{1}中删除了operations }。子句,可能会也可能不会给你想要的结果。我会查看其余的表关系,看看是否还需要进一步的限制。