首页 > 解决方案 > 如何在不删除 mysql 中的 Group 的情况下获取所有记录

问题描述

我正在使用考勤管理系统。我必须准备一些报告打孔报告,其中包括每个员工的所有指纹记录。我想要显示日期和与该日期相关的所有时间的 crate 表。使用以下查询我得到了这样的结果

SELECT * FROM `attendancedata` where `EnrolledID`= 23 GROUP BY 
Date,EnrolledID,Time ORDER BY Date DESC,Time DESC


EnrolledID  Date    Time    
23  2019-09-09  07:58:36
23  2019-09-07  17:25:00    
23  2019-09-07  16:08:27    
23  2019-09-07  07:32:39    
23  2019-09-06  16:00:10    
23  2019-09-06  07:48:51    
23  2019-09-05  16:00:23    
23  2019-09-05  07:40:55    
23  2019-09-04  16:00:39    
23  2019-09-04  07:45:42    
23  2019-09-03  16:00:06    
23  2019-09-03  07:43:32    
23  2019-09-02  16:00:04    
23  2019-09-02  07:56:25    

我的预期结果是

Date        P01       P02       P03    P04     P05    P06    P07
2019-09-02  07:56:25  16:00:04
2019-09-03  07:43:32  16:00:06
2019-09-04  07:45:42  16:00:39
2019-09-05  07:40:55  16:00:23
2019-09-06  07:48:51  16:00:10
2019-09-07  07:32:39  16:08:27 17:25:00
2019-09-08  07:58:36

我该如何解决这个问题?(打卡时间限制最多7次)(使用查询或使用php)

标签: phpmysqlsql

解决方案


MySQL 5.7 及更低版本

  • 使用 MySQL 变量根据date和进行排名time。我们已经假设它仅适用于一个用户。
  • 通过7 列拆分信息用于CASE WHEN派生结果。aggregation
SELECT 
    t.`Date`,
    MAX(CASE WHEN rank = 1 THEN t.`Time` END) AS PO1,
    MAX(CASE WHEN rank = 2 THEN t.`Time` END) AS PO2,
    MAX(CASE WHEN rank = 3 THEN t.`Time` END) AS PO3,
    MAX(CASE WHEN rank = 4 THEN t.`Time` END) AS PO4,
    MAX(CASE WHEN rank = 5 THEN t.`Time` END) AS PO5,
    MAX(CASE WHEN rank = 6 THEN t.`Time` END) AS PO6,
    MAX(CASE WHEN rank = 7 THEN t.`Time` END) AS PO7
FROM (
    SELECT 
        a.`Date`,
        a.`Time`,
        IF(@old_date = a.`Date`, @rank:= @rank + 1, @rank:= 1) AS rank, -- Assigning ranks
        @old_date:= a.`Date`
    FROM attendancedata a, 
    (SELECT @old_date:= '0000-00-00' AS o_d, @rank:= 0 AS r) dt
    WHERE a.EnrolledId = 23  -- Picking only data for user 23
    ORDER By `Date`, `Time`  -- Make sure to do sorting, based on sorted data, ranking will appear.
) AS t
GROUP BY t.`Date`
ORDER BY t.`Date`;

推荐阅读