2011-11-24 41 views
2

所以我想爲我的應用程序構建一些很好的統計數據顯示。我可以做到這一點,因爲我保持命中統計表。它只是跟蹤命中加上一些其他好的數據和它發生的時間。我可以查詢數據庫,以顯示在特定的一天或過去x天的每一天發生的點擊次數,如下面的代碼所示。但是,下面的代碼僅返回有數據的日期。無論一天是否受到歡迎,我都希望顯示最近30天的點擊率。思考?使用PHP定期檢索MySQL統計數據幷包含空數據

SELECT DATE(time) AS theday, COUNT(*) AS thecount 
FROM stats 
WHERE time <= curdate() 
AND time >= DATE_SUB(curdate(), INTERVAL 30 DAY) 
GROUP BY theday ORDER BY time DESC 

主要生產

theday thecount 
2011-11-22 5 
2011-11-21 9 
2011-11-18 10 
2011-11-16 1 
2011-11-11 2 
2011-11-10 15 
2011-11-09 2 
2011-10-26 1 
2011-10-24 6 

正如你可以看到它跳過沒有結果的日期。我明白這是爲什麼,因爲在db中沒有這些日期的行。我想知道我將如何產生一個幾乎像上面那樣工作的查詢,但具有所述間隔的所有日期。 IE:最近30天。

+0

顯然,如果表中沒有該日期的命中,則選擇將不會返回任何內容 –

回答

2

你有3種選擇:

  • 嘗試迭代應用程序邏輯的日期(PHP)
  • 產生充滿了你需要的日期的(臨時)表,並留下了它
  • 加盟用mysql存儲過程溶液等in this answer

實施例爲應用邏輯實現:

<?php 

    date_default_timezone_set('Europe/Paris'); 

    $startdate = strtotime('2011-11-01 00:00:01'); 
    $days = 60; 

    $found_data = array(// this is generated by 1 mysql query 
     array('date_field' => '2011-11-02', 'count' => 5), 
     array('date_field' => '2011-11-03', 'count' => 1), 
     array('date_field' => '2011-11-04', 'count' => 6), 
     array('date_field' => '2011-11-08', 'count' => 9), 
     array('date_field' => '2011-11-09', 'count' => 3), 
     array('date_field' => '2011-11-10', 'count' => 5), 
     array('date_field' => '2011-11-12', 'count' => 1), 
     array('date_field' => '2011-11-15', 'count' => 1), 
     array('date_field' => '2011-11-18', 'count' => 4), 
     array('date_field' => '2011-11-21', 'count' => 9), 
     array('date_field' => '2011-11-23', 'count' => 1), 
     array('date_field' => '2011-11-28', 'count' => 8), 
     array('date_field' => '2011-11-30', 'count' => 6), 
    ); 

    foreach ($found_data as $counts) { // we convert the results to a usable form, you can do this in the query, too 
     $count_info[$counts['date_field']] = $counts['count']; 
    } 

    for ($i = 0; $i <= $days; $i++) { 
     $date = date('Y-m-d', $startdate+$i*60*60*24); 
     printf("%s\t%s\n", $date, array_key_exists($date, $count_info) ? $count_info[$date] : 0); 
    } 

?> 
+0

謝謝deejayy!我找到了這些解決方案,但希望有更容易的事情。我覺得我錯過了一些東西,因爲迭代了180個日期並使180個查詢看起來很重。 – stueynet

+0

1查詢,1次迭代就足夠了。 php中的迭代將獲取所需的所有日期,並且查詢將返回所有包含數據的行。在迭代中,您打印出您找到數據的位置,如果沒有,則打印0。 – deejayy

+0

如果您顯示一個代碼示例,那麼您可以獲得大量積分。大!你有一個缺少日期的數組,加上你的天才功能用零填充缺失的數據。 – stueynet