MySQL& PHP:汇总表中的数据

时间:2012-04-17 04:09:08

标签: php mysql html

好的伙计们,这可能有一个简单的答案,但现在已经把我困扰了几个小时。

我使用PHP / HTML从MySQL表生成表。在MySQL表(TimeRecords)中,我有一个StartTime和EndTime列。在我的SELECT语句中,我从StartTime中减去EndTime,并将其作为TotalHours。这是我到目前为止的查询:

$query = "SELECT *,((EndTime - StartTime)/3600) AS TotalPeriodHours
    FROM TimeRecords
    WHERE Date
    BETWEEN '{$CurrentYear}-{$CurrentMonth}-1'
    AND '{$CurrentYear}-{$CurrentMonth}-31'
    ORDER BY Date
    ";

然后我通过HTML表循环它。到现在为止还挺好。我想要做的是将所有TotalHours加起来并将其放入单独的DIV中。关于1)如何编写select语句和2)从PHP / HTML中调用该代码的任何想法?

提前致谢!

3 个答案:

答案 0 :(得分:3)

试试这个

$query= "
    SELECT ((EndTime - StartTime)/3600) AS Hours, otherFields, ...
    FROM TimeRecords
    WHERE 
        Date BETWEEN '{$CurrentYear} - {$CurrentMonth} - 1'
        AND '{$CurrentYear}-{$CurrentMonth} - 31' ";

$records =mysql_query($query);
$sum= 0;
while($row=mysql_fetch_array($records))
{
      echo"$row['otherFields']";
      echo"$row['Hours']";
     $sum+=$row['Hours'];
 } 

 echo" Total Hours : $sum ";

答案 1 :(得分:0)

只需使用 Sum()的单个查询。如果您已经显示所有行,也可以手动计算它。 (如果分页或使用LIMIT,您将需要一个单独的查询,如下所示。)

$query = "
    SELECT Sum(((EndTime - StartTime)/3600)) AS SumTotalPeriodHours
    FROM TimeRecords
    WHERE 
        Date BETWEEN '{$CurrentYear} - {$CurrentMonth} - 1'
        AND '{$CurrentYear}-{$CurrentMonth} - 31'
";

答案 2 :(得分:0)

如果您使用GROUP BY WITH ROLLUP

具有唯一ID,则可以在同一查询中执行此操作
$query = "
    SELECT unique_id,SUM((EndTime - StartTime)/3600) AS TotalPeriodHours
    FROM TimeRecords
    WHERE Date BETWEEN '{$CurrentYear}-{$CurrentMonth}-1'
      AND '{$CurrentYear}-{$CurrentMonth}-31'
    GROUP BY unique_id WITH ROLLUP
    ORDER BY Date
";

在此实例中,查询的最后一个结果包含NULL和总计。如果您没有唯一的ID,则需要根据Naveen的答案在PHP中进行。

关于您的代码的一些评论:

  • 使用SELECT *不被视为良好做法。选择你需要的列。
  • 并非所有月份都有31天,因此可能会产生意外结果。如果您使用的是PHP5.3 +,则可以使用

    $ date = new DateTime(); $ endDate = $ date->格式('Y-m-t');

这里的“t”标志是该月的最后一天。有关DateTime的更多信息,请参阅PHP docs