SQL Query的分组不正确

时间:2015-10-13 15:02:05

标签: php mysql sql case grouping

我需要创建一个将使用以下数据的SQL查询:

shift_id, emp_id,   date,    starttime, endtime
   1    ,  55   , 2015-10-14, 06:00:00, 10:00:00
   2    ,  55   , 2015-10-15, 03:00:00, 13:00:00
   3    ,  52   , 2015-10-15, 07:00:00, 14:00:00

然后重新安排它,使其在顶部显示“日期”作为列,起始日为NEXT星期日。我已在下面开始尝试,但如果有2名员工(emp_id)在同一天工作,则不显示分组:

SELECT concat(firstname,' ', surname) AS 'Fname', 
    (CASE WHEN DAYOFWEEK(date) = 1 THEN concat(starttime,'-', endtime) END) `Sunday`,
    (CASE WHEN DAYOFWEEK(date) = 2 THEN concat(starttime,'-', endtime) END) `Monday`,
    (CASE WHEN DAYOFWEEK(date) = 3 THEN concat(starttime,'-', endtime)  END) `Tuesday`,
    (CASE WHEN DAYOFWEEK(date) = 4 THEN concat(starttime,'-', endtime)  END) `Wednesday`,
    (CASE WHEN DAYOFWEEK(date) = 5 THEN concat(starttime,'-', endtime)  END) `Thursday`,
    (CASE WHEN DAYOFWEEK(date) = 6 THEN concat(starttime,'-', endtime)  END) `Friday`,
    (CASE WHEN DAYOFWEEK(date) = 7 THEN concat(starttime,'-', endtime)  END) `Saturday`
FROM shifts NATURAL JOIN employees
GROUP BY Fname, date

以下是显示员工姓名两次而不是分组的结果?我哪里出错?:

Result

使用GROUP_CONCAT,错误的结果显示如下:

Result2

2 个答案:

答案 0 :(得分:2)

您选择的列数多于您在GROUP BY中指定的列数。因此,MySQL只会从该组中的一个记录中选择数据来表示它:https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html

  

MySQL扩展了GROUP BY的使用,因此选择列表可以引用GROUP BY子句中未命名的非聚合列。这意味着前面的查询在MySQL中是合法的。您可以通过避免不必要的列排序和分组来使用此功能来获得更好的性能。但是,当GROUP BY中未命名的每个非聚合列中的所有值对于每个组都相同时,这非常有用。 服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的。

尝试这样的事情:

SELECT concat(firstname,' ', surname) AS 'Fname', 
    MAX(CASE WHEN DAYOFWEEK(date) = 1 THEN concat(starttime,'-', endtime) END) `Sunday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 2 THEN concat(starttime,'-', endtime) END) `Monday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 3 THEN concat(starttime,'-', endtime)  END) `Tuesday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 4 THEN concat(starttime,'-', endtime)  END) `Wednesday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 5 THEN concat(starttime,'-', endtime)  END) `Thursday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 6 THEN concat(starttime,'-', endtime)  END) `Friday`,
    MAX(CASE WHEN DAYOFWEEK(date) = 7 THEN concat(starttime,'-', endtime)  END) `Saturday`
FROM shifts NATURAL JOIN employees
GROUP BY Fname, date

答案 1 :(得分:0)

这是你要找的吗? 如果没有,请提供样本结果。 第一个 SELECT 只是隐藏一些tmp字段。如果您通过程序获得结果,则可以将其删除

SELECT Fname, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday
FROM (
  SELECT 
      @timestr:=  concat(starttime,'-', endtime) AS a,
      @datenr:= DAYOFWEEK(DATE) AS b,
      concat(firstname,' ', surname) AS 'Fname',
      COALESCE( IF(@datenr  = 1, @timestr,''))  AS `Sunday`,
      COALESCE( IF(@datenr  = 2, @timestr,''))  AS `Monday`,
      COALESCE( IF(@datenr  = 3, @timestr,''))  AS `Tuesday`,
      COALESCE( IF(@datenr  = 4, @timestr,''))  AS `Wednesday`,
      COALESCE( IF(@datenr  = 5, @timestr,''))  AS `Thursday`,
      COALESCE( IF(@datenr  = 6, @timestr,''))  AS `Friday`,
      COALESCE( IF(@datenr  = 7, @timestr,''))  AS `Saturday`
  FROM shifts s
  LEFT JOIN employees e ON e.emp_id = s.emp_id
  GROUP BY s.date, s.emp_id
) AS result;