2012-04-17 46 views
1

好吧,這可能有一個簡單的答案,但一直困擾着我幾個小時。MySQL&PHP:總結表中的數據

我使用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中調用該代碼的位置的任何想法?

在此先感謝!

+0

看看sql中的SUM。使用ajax從html調用PHP腳本。 – 2012-04-17 04:12:10

+0

@ BenniKa爲什麼你會使用Ajax?問題中絕對沒有建議他使用ajax,而且這也沒有必要。 – liquorvicar 2012-04-17 06:11:46

+0

@liquorvicar我的意思是:如果他想從HTML網站調用它,因爲2)。 – 2012-04-17 12:39:58

回答

0

只需使用一個帶有Sum()的查詢。如果您已經顯示所有行,您也可以手動計算它。 (如果分頁或使用限制,您將需要一個像下面一個單獨的查詢。)

$query = " 
    SELECT Sum(((EndTime - StartTime)/3600)) AS SumTotalPeriodHours 
    FROM TimeRecords 
    WHERE 
     Date BETWEEN '{$CurrentYear} - {$CurrentMonth} - 1' 
     AND '{$CurrentYear}-{$CurrentMonth} - 31' 
"; 
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 "; 
+0

這將是我提到的手動計數方法。如果迭代PHP中的所有行是不可取的,那麼運行單獨的Sum()查詢是一個選項。 – zanlok 2012-04-17 04:24:47

+0

非常感謝!我非常專注於讓MySQL完成我完全忘記PHP的工作 – anthropaulogy 2012-04-17 04:30:23

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-> format('Y-m-t');

這裏的「t」標誌獲得該月的最後一天。有關DateTime的更多信息,請參閱PHP docs