gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:47:46 25 4
gpt4 key购买 nike

我希望获取用户在其工作站上处理每个批处理的总时间、已完成的预计总工作量、用户获得的报酬以及用户今年每天发生的故障次数。如果我可以将所有这些连接到一个查询中,那么我可以在 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

交叉连接导致了问题。

最佳答案

不,一般来说,Having 子句用于过滤 Group by 的结果 - 例如,仅报告那些在 24 小时内获得报酬的人员一天(HAVING SUM(ramses.timesheet_detail.paidTime) > 24)。除非您需要对聚合结果执行过滤,否则根本不需要 having 子句。
大多数条件应移至 where 子句中,或作为连接的一部分,原因有两个 - 1) 通常应尽快完成过滤,以限制查询所需的工作去表演。 2) 如果过滤已经完成,重新声明可能会导致查询执行额外的、不需要的工作。
从我到目前为止所看到的来看,您似乎正在尝试按天汇总事情 - 尝试将 group by 子句中的最后一列更改为 date(ramses.batch_log .start_time),或者您按(我假设是)时间戳进行分组。

<小时/>编辑:
关于模式名称 - 是的,您可以在 fromjoin 部分中命名它们。通常,查询也可以根据某些默认搜索列表解析所需的架构(如何设置或是否设置取决于您的数据库)。
以下是我重新格式化查询的方法:

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 条。您还删除了 操作group by 子句中的 .name 可能会也可能不会给您想要的结果。我会调查您的其余表关系,看看是否需要进行任何进一步的限制。

关于mysql - 如何将一个表连接到另一个表,其中 userid = userid 但仅限于该日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com