博客的按月归档是怎么实现的?统计每个月的日志篇数01/04/2008
今天和小鸡的讨论中提到的这个问题,最初一直在想SQL语句应该怎么写?现在的时间存入数据库一般都采用UNIX时间戳的形式,还原起来也方便。因此,自然而然的想到构建每个月初和月末的时间段,然后每个月查数据库统计一次,如果要统计一年中每个月的日志篇数,就要查询12次数据库,效率相当的低!后来就偷看了BO-BLOG的代码,发现它只查询一次数据库就可以统计每个月的日志篇数,绝对的值得学习,效率也是非常的好!(后面也截取了F2BLOG的按月归档的算法,和BO的如出一辙。)
下面赏析下代码:
BO的代码片段:
[codes=php]
$allvaliddates=$blog->getarraybyquery("SELECT `pubtime` FROM `{$db_prefix}blogs` ORDER BY `pubtime` DESC");
$allvaliddates=$allvaliddates['pubtime'];
$resultdates=array();
$result="<table width=\"100%\">";
if (is_array($allvaliddates)) {
foreach ($allvaliddates as $time) {
$y=gmdate('Y', $time+3600*$config['timezone']);
$m=gmdate('n', $time+3600*$config['timezone']);
$resultdates[$y][$m]+=1;
}
[/codes]
再看F2BLOG的:
[codes=php]
$archives = $DMC->query("SELECT postTime FROM ".$DBPrefix."logs where $saveType ORDER BY postTime DESC");
$articledb = array();
while ($article = $DMC->fetchArray($archives)) {
$article['dateline'] = format_time("Y,m",$article['postTime']);
$articledb[]=$article['dateline'];
}
unset($article);
$archivedb = array_count_values($articledb);
unset($articledb);
[/codes]
同样的只查询一次数据库,就搞定了按月归档,唉,多多学习了,谨做小记,告诫自己一定要写出高效的代码!

其实可以通过SQL中的MONTH()函数和group搭配能更容易的实现。不需要程序去转一次。一句就搞定了。可以翻翻。
以后要多多偷看别人的代码了!
谢谢,受益匪浅