php - 使用 php 和 mysql 按年和月对存档进行分组

标签 php mysql pdo

我想创建一个这样的归档列表:

  • 2014
    • 三月
    • 二月
      • 发布 1
      • 后 2
  • 2013
    • 11 月
      • 发布 1

我正在使用 PDO。我使用的表将 postDate 作为日期时间。 postSlug 用于获取干净的 url。我现在使用的编码是:

    <h1>Archives</h1>
    <hr />

    <ul>
<?php
$stmt = $db->query("SELECT postTitle, Month(postDate) as Month, Year(postDate) as Year FROM blog_posts_seo ORDER BY postDate DESC");
while($row = $stmt->fetch()){
$posts = $row['postTitle'];
$year = $row['Year'];
    $monthName = date("F", mktime(0, 0, 0, $row['Month'], 10));
    $slug = 'a-'.$row['Month'].'-'.$row['Year'];
        echo "<li>$year</li>";
    echo "<ul><li><a href='$slug'>$monthName</a></li>";

        echo "<ul><li><a href='#'>$posts</a></li></ul></ul>";
}
?>
</ul>

我得到的结果如下:

2014
    May
        Post
2013
    June
        Post
2013
    June
        Post
2012
    June
        Post

简而言之,我如何使用 php 对帖子和月份进行相应的分组? 我是 php 和 mysql 的初学者。因此,如果您知道解决方案,可以帮助我完成完整的编码,那将很有帮助。谢谢!

最佳答案

那怎么样?

$data = array();
while($row = $stmt->fetch()){
  $monthName = date("F", mktime(0, 0, 0, $row['Month'], 10));     
  $data[$row['Year']][$monthName][] = array(
   'post' => $row['postTitle'],
   'slug' => 'a-'.$row['Month'].'-'.$row['Year']
  );
}
echo '<ul>';
foreach ($data as $year => $yearData){
   echo "<li>$year<br/>";
   echo '<ul>';
   foreach ($yearData as $month => $monthData){
      echo "<li>$month<br/>";
      echo '<ul>';
      foreach ($monthData as $number => $postData){
        echo "<li><a href='${postData['slug']}'>Post $number</a><br/>";
        echo "<a href='#'>${postData['post']}</a></li>";
      }
      echo '</ul></li>';
   }
   echo '</ul></li>';
}
echo '</ul>';

此解决方案以 PHP 方式实现,但您也应该能够通过 SQL 查询获得结果,例如:

SELECT
    Year(postDate) as Year, Month(postDate) as Month,
    GROUP_CONCAT(postTitle) as posts
FROM
    blog_posts_seo
GROUP BY Year, Month
ORDER BY postDate DESC

应该在一行(未测试)中返回所有与年份和月份相关的帖子,以逗号分隔。使用 WITH SEPARATOR 选项指定不同的分隔符(查看文档)。

文档:

关于php - 使用 php 和 mysql 按年和月对存档进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23985126/

相关文章:

php - 如何在laravel nova中使用用户名而不是电子邮件登录?

mysql - 获取 mariadb/mysql 中按分数表排序的 N 条上一条和下一条记录

mysql - 对通过连接创建的某些列进行联合?

mysql - 需要帮助简化 SQL 查询以避免 WHERE 和 SELECT 中的冗余数学运算

php - PDO fetchAll 不返回所有行

mysql - 这段代码可以安全地防止注入(inject)吗?

php - PDO prepare() 错误 Php/Mysql

php - 使用 PHP 在 WordPress 中设置页面标题

php - 仅检索数据库中的部分记录

php - 使用 PHP 获取表中的照片