【问题标题】:Group Sum Per Day of Week and Put in Array一周中每天的分组总和并放入数组中
【发布时间】:2017-07-07 11:33:31
【问题描述】:

我有一个存储劳动力数据的表。其中一列是特定项目的工作小时数 (rthours),另一列是日期 (labor_date)。

我需要获取本周每一天的所有工作时间的总和,并将它们放入一个数组中,以便与生成条形图的图表脚本一起使用。

图表从周一开始,到周日结束。

我编写了以下 select 语句,但它返回错误的值,它也不会考虑是否没有记录某一天的任何小时数。

有什么建议吗?

代码如下:

$sql = "SELECT SUM(rthours) as total FROM data WHERE (WEEK(labor_date) = WEEK(NOW())) AND (user_name = '$user') GROUP BY DAY(labor_date) ORDER BY DAY(labor_date)";

$result = mysqli_query($conn, $sql);
$thours = array();

while ($row = mysqli_fetch_assoc($result)) {
           $thours[] = $row["total"];
        }
mysqli_close($conn);

?>

【问题讨论】:

  • 在 while 循环中,添加类似 j=0 的内容,然后迭代 1 并使用 $thours[j] = $row['total'];
  • 为什么下面有你的 2 个答案?哪个是正确的?

标签: php mysql select group-by dayofweek


【解决方案1】:

首先,您的代码对SQL injection 开放。我不会在这里解决这个问题,但请修复它。

您需要使用函数weekday (1 - 7),而不是day (1 - 31),因为后者可能会跨越一个月的界限,然后产生错误的顺序。

为了填补空白,您可以在查询中添加一个虚拟表,该表将生成数字 1 到 7,然后将您的数据与该数据进行外部连接。对于缺少的日期,您的总和仍将包括在内,但 null。使用coalesce,您可以将其转换为值 0:

SELECT    COALESCE(SUM(rthours), 0) as total 
FROM      (SELECT 1 as weekday
             UNION ALL SELECT 2 UNION ALL SELECT 3 
             UNION ALL SELECT 4 UNION ALL SELECT 5 
             UNION ALL SELECT 6 UNION ALL SELECT 7) as ref
LEFT JOIN data 
       ON DAYOFWEEK(labor_date) = ref.weekday
WHERE     WEEK(labor_date) = WEEK(NOW())
AND       user_name = ?
GROUP BY  ref.weekday 
ORDER BY  ref.weekday

【讨论】:

  • 您好,感谢您的帮助。这不起作用。该图表将在一周中的某一天缺少数据的任何地方填充数字 8。一名员工周一记录了 8 小时,但本周剩余时间还没有数据,但图表显示周一到周五的 8 小时,
【解决方案2】:

想通了。使用此 select 语句有效:

SELECT SUM(rthours) total
  FROM data 
 WHERE (WEEK(labor_date) = WEEK(NOW())) 
   AND (YEAR(labor_date) = YEAR(NOW())) 
   AND (user_name = '$user') 
 GROUP 
    BY WEEKDAY(labor_date) 
 ORDER 
    BY WEEKDAY(labor_date);

【讨论】:

  • ... 但它不能解决您问题的第二部分:填补空白。看我的回答。
  • 你怎么知道哪个总数是哪个?
【解决方案3】:

修改后的代码:

"SELECT COALESCE(SUM(rthours) + SUM(othours) + SUM(trthours) + SUM(tothours), 0) as total
FROM (SELECT 1 as weekday
             UNION ALL SELECT 2 UNION ALL SELECT 3
             UNION ALL SELECT 4 UNION ALL SELECT 5
             UNION ALL SELECT 6 UNION ALL SELECT 7) as ref
LEFT JOIN data
       ON DAYOFWEEK(labor_date) = ref.weekday
WHERE     WEEK(labor_date) = WEEK(NOW()) AND Year(labor_date) = Year(NOW())
AND       user_name = '$user'
GROUP BY  ref.weekday
ORDER BY  ref.weekday";

代码正在抓取数据,但当某一天的数据不存在时,仍然没有放置零。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多