[mysql]年和月计数后文章存档

标签: MySQL PHP
发布时间: 2017/1/9 22:50:24
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我需要按年和月这样列出总员额文章存档︰

输出 (我需要)︰

2014
   January(31)
   February(28)
   March(0)
   April(130)
   May(450)
   June(0)
   July(0)
   August(0)
   September(0)
   October(520)
   November(20)
   December(31)

PHP:

$sql = "SELECT title, YEAR(FROM_UNIXTIME(timestamp)) AS YEAR, 
                MONTHNAME(FROM_UNIXTIME(timestamp)) AS MONTH, 
                COUNT(*) AS TOTAL 
         FROM article GROUP BY YEAR, MONTH ORDER BY YEAR DESC, MONTH ";

$newsdata = DB->fetch($sql);

$currentYear = null;

foreach($newsdata AS $news){            
  if ($currentYear != $news['YEAR']){
     echo '<ul>'.$news['YEAR'].'</ul>';
  $currentYear = $news['YEAR'];
  } 
     echo '<li>'.$news['MONTH'].' '.$news['TOTAL'].'</li>';
  }

我的代码工作,但如果在本月发表文章打印唯一月。

输出︰

2014
       January(31)
       February(28)
       April(130)
       May(450)
       October(520)
       November(20)
       December(31)

我需要为每个月列出所有月和打印总数条。如果月不张贴文章打印 (0) 本月。

如何可以解决我的问题?路上的代码是真的吗? !

解决方法 1:

您的数据库查询不会返回行有没有文章一个月。它不知道任何关于几个月。所以你需要处理这在代码中有一个数组的所有月份和遍历。另一种选择将改变您的架构,有所有的 12 个月,另一个表的加入。但我认为以下是你更容易︰

$months = array( "January", "February", ...  );

然后相反你可以在你的输出上执行以下操作︰

// Index article counts by month and year for easy lookup
$indexedNewsData = array();
foreach ($newsdata as $news) {
  $indexedNewsData[$news['YEAR']][$news['MONTH']] = $news['TOTAL'];
}

// Then print output
foreach($newsdata AS $news){            
  if ($currentYear != $news['YEAR']){
    echo '<ul>'.$news['YEAR'].'</ul>';
    $currentYear = $news['YEAR'];
  } else {
    // Continue here otherwise we will print each year's data 12x
    continue;
  }
  foreach ($months as $month) {
    $total = intval($indexedNewsData[$news['YEAR']][$month]);        
    echo '<li>'.$month.' '.$total.'</li>';
  }     
}
官方微信
官方QQ群
31647020