MySQL使用员工姓名逐月生成年度报告

时间:2017-12-18 13:00:06

标签: php mysql sql phpmyadmin

我有两个表用户和login_table

用户表

 id   Name    status
----------------------
 1   Johan      1    
 2   Smith      1    
 .  .   .       .    
----------------------

登录表

 id     user_id   login_date    hours
-------------------------------------
 1        1       2017-01-01    8    
 2        1       2017-01-02    7    
 3        2       2017-01-03    12   
 4        2       2017-01-02    10   
 .        .       .             .     
-------------------------------------

无论如何我们可以获取如下的数据吗?

index   user_id  name   Jan  Feb    Mar ....    Dec Total
---------------------------------------------------------
1         1     Johan   100  120    115 ....    120  455
1         2     Smith   100  110    120 ....    110  440
.         .     .        .    .      .           .    .
---------------------------------------------------------

我们已经使用PHP / MYSQL完成了这项工作,但需要花费很多时间来处理和执行。无论如何我们可以直接从MySQL获取它吗?

1 个答案:

答案 0 :(得分:4)

我不知道index是什么,但其余的是联接,group by和条件聚合:

select u.id, u.name,
       sum(case when month(l.login_date) = 1 then hours else 0 end) as jan,
       sum(case when month(l.login_date) = 2 then hours else 0 end) as feb,
       . . .,
       sum(hours)
from users u join
     login l
     on u.id = l.login_id
where l.login_date >= '2017-01-01' and l.login_date < '2018-01-01'
group by u.id, u.name;

注意:

  • 日期比较故意使用>=<。这是首选,因为MySQL可以使用数据索引。
  • 这假设您只需要在一年中登录的用户。否则,左连接是合适的。
  • 我不知道index是什么。也许你的意思是status