首页 文章

每周一组的总和并放入数组

提问于
浏览
-1

我有一张存储劳动力数据的表格 . 其中一列是特定项目的工作小时数(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);

?>

3 回答

  • 0

    编辑过的代码:

    "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";
    

    代码正在抓取数据,但在某一天数据不存在时仍未放置零 .

  • 0

    首先,您的代码对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
    
  • 1

    弄清楚了 . 使用此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);
    

相关问题