打印表中不存在的行?

时间:2010-01-21 04:54:33

标签: php mysql group-by

我有一个查询按日期对按行分组的行进行求和。基本上,它计算一天中的会员申请数量,并逐日打印出结果。当然,如果一天没有应用程序,它就不会显示该行(例如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 

4 个答案:

答案 0 :(得分:1)

这与another question on SO非常相似。普遍的共识似乎是:

  1. 在程序的应用程序层填写空白日期。
  2. 创建一个临时表,用日期填充它,然后加入临时表。
  3. 最佳选择是#1 - 它是最不易复杂的,应该具有最低的开销。

答案 1 :(得分:0)

选择相关日期范围。然后遍历日期范围,查看当前行是否匹配。如果没有则输出0.如果是,则输出适当的数字并前进到下一行。

答案 2 :(得分: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'];
}

如果您想按顺序排列日期,只需对数组进行排序。

答案 3 :(得分:0)

为了列出一年中的所有日期而创建一个表并不过分;它被称为helper table,可以使这个查询(以及很多类似的查询)非常容易。