【问题标题】:Select where sum less than value选择总和小于值的地方
【发布时间】:2013-07-25 08:23:56
【问题描述】:

我正在开发一个 PHP/MySQL 时间表系统,我要创建的报告会选择所有在两个日期之间工作时间少于所需时间的员工。 员工的时间以小时和分钟 (INT) 存储,但我只关心小时。

员工表如下所示:

ID | Name
1  | George
2  | Fred

timesheet_entry 表:

ID | employeeID | hour | date
1  | 1          | 2    | 2013-07-25
2  | 2          | 4    | 2013-07-25
3  | 1          | 3    | 2013-07-25

因此,如果我选择在 2013 年 7 月 25 日工作少于 5 小时(PHP 变量 hrsLimit)的员工,它应该返回 2 Fred,因为 George 在该日期总共工作了 5 小时。 我有一个 HTML 表单,因此用户可以为查询设置变量。

我试过了:

SELECT employeeid,
       employeename
FROM   employee
       JOIN timesheet_entry tse
         ON tse.tse_employeeid = employeeid
            AND Sum(tse.hour) < $hrslimit  

我还没有担心日期。

这里令人困惑的是我们要连接两个表。也许我应该选择小时并将 SUM 子句放在 WHERE 的末尾?

【问题讨论】:

    标签: mysql join sum


    【解决方案1】:

    您需要对数据进行分组,然后将 SUM 条件放在查询的 HAVING 部分。

    select employee.id,
           employee.Name,
           Date,
           sum(`hour`) 
    from timesheet_entry
    join employee on timesheet_entry.employeeID=employee.ID
    group by timesheet_entry.employeeID,date
    having sum(`hour`)<$hrslimit
    

    SQLFiddle demo

    【讨论】:

    • sum(hour) as sum_hour 然后having sum_hour&lt;$hrslimit 不应该有更好的性能吗?
    • @jaczes 好的。我认为 SQL 优化器会使性能保持不变。
    • @valex 谢谢您的快速回复。我的例子不是最好的,都在同一天,但我现在添加了 GROUP BY date BETWEEN 子句sqlfiddle.com/#!2/1e454/3 来完成我的解决方案。再次感谢
    • 如果可以的话,我会亲吻你。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2010-11-07
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-14
    • 2016-11-04
    • 2016-03-29
    相关资源
    最近更新 更多