Sql和php按发布的年,日和月对数据进行分组

时间:2017-01-28 04:18:05

标签: php mysql sql

我一直试图根据发布的年份和月份来显示来自数据库的帖子,但由于我已经尝试了所有可能的事情而无法做到这一点,但仍然认为这可以在SQL QUERY中完成并在PHP端支持它。下面是我的数据库结构

id  | title                |  date 
-------------------------------------------------
1   | hello this is a post | 2016-01-03 11:33 AM
2   | this is what i think | 2016-01-03 10:33 PM
3   | this is it           | 2017-14-06 06:33 PM
4   | Blah Blah Blah       | 2017-01-03 10:33 AM
5   | is what i think      | 2016-04-03 10:33 PM

现在我想以这种方式选择和分组

  

您在2016-01-03的帖子

     

你好,这是一篇文章

     

这就是我认为你的

     

发表于2017-14-06

     

这是

     

您在2017-01-03的帖子

     

Blah Blah Blah

     

您在2017-01-03的帖子

     我认为

我尝试用下面的代码

来做这件事
<?php
//I swear i don't know what else to do here
$db->prepare('SELECT * FROM post 
GROUP BY ("")
ORDER BY date');
$db->execute();
$output = $db->getAll();
$db->free();
if(!is_null($output)){
foreach($output as $row){
$title = $row->title;
$date = $row->date;

/* 
 Only this path i got near but i can only display post for this month using   $currentDate below.
But how can i get other once split according to date?
*/

$split = explode(" ", $date);
$currentDate = date('Y-m-d');
if($split[0] == $currentDate){
  echo 'post on '.$currentDate.'<br/>'.$title;
}else{
   echo 'post on '.$split[0].'<br/>'.$title;
 }
?>

2 个答案:

答案 0 :(得分:2)

这里有三个要求。一种是在没有时间的情况下呈现帖子的日期。第二种是按日期/时间订购帖子。

可以使用这样的查询完成。

SELECT DATE(`date`) as date, `title` FROM post ORDER BY `date`

GROUP BY没有任何目的。

第三个要求是,如果连续帖子的日期相同,则只提供一次。这必须在php中完成。

$prev_date = "";
foreach ($output as $row) {
    $title = $row->title;
    $date = $row->date;
    if ($date != $prev_date) {
        echo "Posts on " .$date;
    }
    echo information about the post
    $prev_date = $date;
}

诀窍是使用名为$ prev_date的变量来检测日期何时从一行变为行。

答案 1 :(得分:1)

我最喜欢的方法总是首先将结果放入数组。

$date = date('Y-m-d', strtotime($row['date']));
$result[$date][] = $row['title'];

从上面的数组中,您可以使用foreach输出结果。

foreach($result as $key => $value) {
    echo 'Your post on '.$key.'<br>';
    foreach($value as $k => $v) {
        echo $v.'<br>';
    }
}