2010-01-21 53 views
2

我有一個查詢,按日期分組行數。基本上,它會統計一天中的多少個會員申請,並且每天都會打印出結果。當然,如果沒有應用程序在一天,它不會顯示該行(例如低於15日和17日沒有應用.....打印表中不存在的行嗎?

Date   | Applications 
----------------------------------- 
12/01/2010 | 44 
13/01/2010 | 73 
14/01/2010 | 66 
16/01/2010 | 102 
18/01/2010 | 12 
19/01/2010 | 22 

我需要它來打印出日期和0當有沒有應用程序,從而無天被跳過。任何想法如何做到這天,我想用一年中的每一天加入到表中,但似乎矯枉過正

查詢低於

SELECT 
application_date AS Date, 
COUNT(*) AS Applications 
FROM members 
GROUP BY ap_date 

回答

0

在日期範圍內選擇,然後遍歷日期範圍,尋找看看當前行是否匹配。如果不是,則輸出0.如果是,則輸出適當的數字並前進到下一行。

+0

遍歷結果(例如使用遊標)可能會很慢。如果您使用不需要進一步處理的基於集合(即一次性)查詢,SQL和關係數據庫通常會更好地工作。 – 2010-01-28 13:12:38

1

這與another question on SO非常相似。一般共識似乎是:

  1. 在程序的應用程序層填寫空白日期。
  2. 創建一個臨時表,填充日期,並加入臨時表。

最好的選擇是#1 - 它是最不復雜的,應該有最低的開銷。

+0

即時通訊在PHP中這樣做,不太清楚如何去做 – Tony 2010-01-21 12:52:58

0

我想創建一個PHP數組,數組的索引將是一個字符串,日期,我更喜歡這種格式YYYY-MM-DD,我會做這樣的事情(注意是關鍵的日期格式是很重要的)

// how far in the past to go 
$days_in_the_past = 365; 
// default to today, unix timestamp file 
$start_day = time(); 

// the array that contains all out dates 
$dates = array(); 

// sec * min * hours 
$secs_in_a_day = 60 * 60 * 24; 

// note we're going backwards here 
for ($i=0; $i <= $days_in_the_past; $i++) 
{ 
    $key = date('Y-M-D', ($start_day - ($secs_in_a_day * $i))); 
    // this sets the format of 2010-01-21 as the key 
    $dates[$key] = ""; 
} 

$query = 'SELECT date, app FROM table'; 
$result = mysql_query($query); 
while ($row = mysql_fetch_assoc($result)) 
{ 
    $key = date('Y-M-D', strtotime($row['Date'])); 
    $dates[] = $row['Applications']; 
} 

如果您想按順序排列日期,只需排序數組。

0

創建一個表格只是爲了列出一年中的所有日期並不是矯枉過正;它被稱爲helper table,並且可以使這個查詢非常容易。