MySQL GROUP BY和合并列

时间:2015-09-28 10:09:04

标签: mysql group-by

我有一张表格,其中包含 student_id 以及他们抵达学校时的日期时间戳( log_time )。

我已经构建了一个查询,列出了student_id以及他们本周到达的时间。我如何组合结果,例如下面的数据,student_id 4211在一行显示的数据与星期二,星期三和星期四的时间?使用GROUP BY只显示一次。我需要以某种方式按student_id分组,但结合一天的时间。

SELECT
    student_id,
    if( (DAYOFWEEK(log_time)=2)=0, '-', DATE_FORMAT(log_time,'%H:%i:%s') ) AS monday_time,
    if( (DAYOFWEEK(log_time)=3)=0, '-', DATE_FORMAT(log_time,'%H:%i:%s') ) AS tuesday_time,
    if( (DAYOFWEEK(log_time)=4)=0, '-', DATE_FORMAT(log_time,'%H:%i:%s') ) AS wednesday_time,
    if( (DAYOFWEEK(log_time)=5)=0, '-', DATE_FORMAT(log_time,'%H:%i:%s') ) AS thursday_time,
    if( (DAYOFWEEK(log_time)=6)=0, '-', DATE_FORMAT(log_time,'%H:%i:%s') ) AS friday_time
FROM
    tbl_student_register
WHERE
    YEARWEEK(`log_time`, 1) = YEARWEEK(CURDATE(), 1) 

这将从我的数据中得出以下结果

enter image description here

1 个答案:

答案 0 :(得分:0)

您需要条件聚合:

SELECT student_id,
       MAX(CASE WHEN DAYOFWEEK(log_time) = 2 THEN DATE_FORMAT(log_time, '%H:%i:%s') END) AS monday_time,
       . . .
FROM tbl_student_register
WHERE YEARWEEK(`log_time`, 1) = YEARWEEK(CURDATE(), 1) 
GROUP BY student_id;

MAX()将值组合在一起。如果给定日期只有一个条目,则它将返回该条目。如果有多个条目,您需要找出处理该条目的逻辑。