2012-02-08 65 views
1

我有這個疑問PHP數組顯示分組數據範圍

$query = mysql_query ("SELECT type, count(*), date FROM tracking WHERE htcode='$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') GROUP BY type, date ORDER BY date ASC"); 

此代碼:

while ($result = mysql_fetch_assoc($query)){ 
echo $result['date'] .'/' .$result['type'].' = ' .$result['count(*)']; 
echo '<br>'; 
} 

給我:

2012-02-01/viewed = 2 
2012-02-03/emailed = 1 
2012-02-04/shared = 1 
2012-02-05/viewed = 1 
2012-02-07/viewed = 2 
2012-02-07/shared = 3 
2012-02-07/emailed = 1 
2012-02-07/printed = 1 

我怎麼能走查詢數組並將所有(查看,共享,通過電子郵件發送,打印,使用)用於今天,針對昨天以及針對日期範圍(例如最近30天)?

回答

1

要獲得特定日期範圍的所有結果,請勿按日期分組;而是使用WHERE子句來限制計數的日期。否則,查詢非常相似。

$query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type"); 

這裏只是本身格式化了幾行爲清楚起見,查詢:

SELECT type, count(*) 
FROM tracking 
WHERE htcode = '$htG' 
    AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') 
    AND date >= '$start_date' AND date <= '$end_date' 
GROUP BY type 

只要確保你的$start_date$end_date第一設置的值。例如,今天你只是他們兩個設置爲這樣:

$start_date = date('Y-m-d'); 
$end_date = date('Y-m-d'); 

注意date('Y-m-d')是像YYYY-MM-DD格式只是今天的日期。

昨天,你在昨天的時間戳傳遞到date()功能,但使用相同的格式:

$start_date = date('Y-m-d', strtotime('yesterday')); 
$end_date = date('Y-m-d', strtotime('yesterday')); 

而且在過去的三十天你會開始在30天前和結束的今天:

$start_date = date('Y-m-d', strtotime('30 days ago')); 
$end_date = date('Y-m-d'); 

你可以這樣做任何開始/結束日期。請注意,我使用的是strtotime(),它允許您使用很多英語短語來指定時間戳,而不必進行日期算術。

而且,因爲你會被多次執行查詢時,它很可能是有意義的邏輯分離出來,到它自己的功能:

function report_range($htG, $start_date, $end_date) { 
    $query = mysql_query("SELECT type, count(*) FROM tracking WHERE htcode = '$htG' AND type IN ('viewed', 'shared', 'printed', 'emailed', 'used') AND date >= '$start_date' AND date <= '$end_date' GROUP BY type"); 

    while ($result = mysql_fetch_assoc($query)){ 
     echo $start_date . '-' . $end_date . '/' . $result['type'] . ' = ' . $result['count(*)']; 
     echo '<br>'; 
    } 
} 

然後像這樣運行在(最近30天這個例子):

report_range($htG, date('Y-m-d', strtotime('30 days ago')), date('Y-m-d')); 
+0

感謝您的答覆本..我想顯示4個不同的結果。今天,昨天,上個月和去年。這就是爲什麼我認爲我會用PHP來排序日期..你會建議什麼? – 2012-02-08 01:51:52

+0

或者您可以使用'WHERE date BETWEEN'$ start_date'AND'$ end_date''以獲得更好的可讀性。 – 2012-02-08 01:52:04

+1

@DanielHunter,我添加了一些例子,展示了今天,昨天和過去30天的情況。一年來,你的意思是365天嗎?如果是這樣,你可以使用與過去30天相同的格式,只需要365. – 2012-02-08 01:56:24