php - 按年份和月份计算帖子存档

标签 php mysql

我需要按年和月列出帖子文章存档总数,如下所示:

输出(我的需要):

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)

我该如何解决我的问题?我的代码/方式是真的吗?!

最佳答案

您的数据库查询不会返回没有文章的月份的行。它对月份一无所知。因此,您需要通过拥有所有月份的数组并循环遍历该数组来在代码中处理此问题。另一种方法是更改​​您的架构,使用另一个包含所有 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>';
  }     
}

关于php - 按年份和月份计算帖子存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24418268/

相关文章:

mysql - PHPmyadmin INNoDB恢复

mysql - SQL插入查询中的Sysdate函数

c# - 当尝试使用Task.Run()在MySql中运行插入查询时,它抛出以下异常: "Unable to connect to any of the specified MySQL hosts."

php - PDO 方法可以失败并且不抛出 PDOException 吗?

php - 我可以在 Agile Toolkit 中创建带有子菜单的菜单吗?

javascript - 使用 Google javascript API 进行身份验证

mysql - 触发器根据mysql中的另一个表更新来更新表

c# - ASP.NET Core 项目中的 MySql 连接字符串错误

php - Ruby on Rails 或 PHP 框架

php - "Notice: Undefined variable"、 "Notice: Undefined index"、 "Warning: Undefined array key"和 "Notice: Undefined offset"使用 PHP