简体   繁体   English

按 mysql 和 php 中的日期范围分组

[英]Group by date range in mysql and php

I have a regular table for posts, and it has a datetime field.我有一个常规的帖子表,它有一个日期时间字段。 I want to get posts in specific date ranges.我想获得特定日期范围内的帖子。

Eg I want all posts that were created between Nov 10, 2019 and Nov 13, 2019 as a single group of posts, and another group of posts that were created in other date range, like between Jan 1, 2019 and Jan 15,2019 .例如,我希望在 2019 年 11 Nov 10, 2019 Nov 13, 2019之间创建的所有帖子作为一组帖子,以及在其他日期范围(例如Jan 1, 2019 Jan 15,2019日之间)创建的另一组帖子。

What I would like is to have something like this:我想要的是有这样的东西:

[
"Nov 10,2019-Nov 13,2019"  =>  [['id'=>1,'text'=>'something'],['id'=>2,'text'=>'something'],...],
"Jan 1,2019-Jan 15,2019"  =>  [['id'=>1,'text'=>'something'],['id'=>2,'text'=>'something'],...],
...
]

Is it possible using a single query?是否可以使用单个查询?

I know I can group them together using something like GROUP BY DATE(dateTimeField) .我知道我可以使用GROUP BY DATE(dateTimeField)之类的东西将它们组合在一起。

But how can I group it by date range?但是如何按日期范围对其进行分组?

EDIT : what I currently have:编辑:我目前拥有的:

SELECT * FROM posts WHERE ( (datetime >= '2019-11-10 00:00:00' AND datetime <= '2019-11-13 23:59:59') OR (datetime >= '2019-01-01 00:00:00' AND datetime <= '2019-01-15 23:59:59')) LIMIT 0,50

this is my query and i know i can use BETWEEN for this purpose but I'm considering that's not the question.这是我的查询,我知道我可以为此目的使用BETWEEN ,但我认为这不是问题所在。

the question is how can I group by the range like this:问题是我如何按这样的范围分组:

SELECT * FROM posts WHERE ( (datetime >= '2019-11-10 00:00:00' AND datetime <= '2019-11-13 23:59:59') OR (datetime >= '2019-01-01 00:00:00' AND datetime <= '2019-01-15 23:59:59')) LIMIT 0,50 GROUP BY THE_RANGE_SPECIFIED_IN_WHERE_CLAUSE

i DON'T want this:我不想要这个:

SELECT * FROM posts WHERE ( (datetime >= '2019-11-10 00:00:00' AND datetime <= '2019-11-13 23:59:59') OR (datetime >= '2019-01-01 00:00:00' AND datetime <= '2019-01-15 23:59:59')) LIMIT 0,50 date(datetime)

i dont want to separate posts based on each individual days but based on the same range I have specfied.我不想根据每一天分开帖子,而是根据我指定的相同范围。

Assuming that your table is named TableX and the field containing post dates is named post_date see the table below with 3 columns:假设您的表名为TableX并且包含发布日期的字段名为post_date请参见下表,其中包含 3 列:

+----+------------+-------------+
| id | post_date  | text        |
+----+------------+-------------+
|  1 | 2019-11-10 | xsomething  |
|  2 | 2019-11-10 | ysomething  |
|  3 | 2019-11-11 | ysomething  |
|  4 | 2019-11-12 | ysomething  |
|  5 | 2019-11-13 | xysomething |
|  6 | 2019-01-01 | xysomething |
|  7 | 2019-01-05 | xysomething |
|  8 | 2019-01-06 | ysomething  |
|  9 | 2019-01-10 | xsomething  |
| 10 | 2019-01-11 | ysomething  |
+----+------------+-------------+

To get the posts grouped by date range you will run the following PHP/MySQL script:要获取按日期范围分组的帖子,您将运行以下 PHP/MySQL 脚本:

//Query databases using CASE,THEN
$sql1 = "SELECT id AS post_id,text,post_date,  
    CASE 
        WHEN post_date BETWEEN '2019-11-10' AND  '2019-11-13' 
    THEN 1 
        WHEN post_date BETWEEN '2019-01-01' AND  '2019-01-15' 
    THEN 2 
        Else 1 END AS date_range_id FROM posts";
$sth = $con->prepare($sql1);
    $sth->execute();
    $sth->SetFetchMode(PDO::FETCH_ASSOC);
    while ($row=$sth->fetch()){
        $date_range_id = $row['date_range_id'];

        if($date_range_id == 1){
            $post_id = $row['post_id'];
            $text = $row['text'];
            $post_date = $row['post_date'];

            $array[] = [$post_id,$text,$post_date];
        }
        elseif($date_range_id == 2){
            $post_id = $row['post_id'];
            $text = $row['text'];
            $post_date = $row['post_date'];
            $array5[] = [$post_id,$text,$post_date];
        }

    }
$x= 1;
//create an associative array  $q of $array[]
foreach($array as $y => $z){
    $q[] = ['id' => $x++,
        'post_id'=>$z[0],
        'text' =>$z[1],
        'post_date' => $z[2]
];

}

//create an associative array $r of $array5[]
$l= 1;
foreach($array5 as $y => $z){
    $r[] = ['id' => $l++,
        'post_id'=>$z[0],
        'text' =>$z[1],
        'post_date' => $z[2]];
}

$post_range = [
    "'2019-11-10' AND '2019-11-13'" => $q,
    "'2019-01-01' AND '2019-01-11'" => $r];
echo "<pre>";print_r($post_range);echo "</pre>";

This will return the following multi-dimensional array这将返回以下多维数组

Array
(
    ['2019-11-10' AND '2019-11-13'] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [post_id] => 1
                    [text] => xsomething
                    [post_date] => 2019-11-10
                )

            [1] => Array
                (
                    [id] => 2
                    [post_id] => 2
                    [text] => ysomething
                    [post_date] => 2019-11-10
                )

            [2] => Array
                (
                    [id] => 3
                    [post_id] => 3
                    [text] => ysomething
                    [post_date] => 2019-11-11
                )

            [3] => Array
                (
                    [id] => 4
                    [post_id] => 4
                    [text] => ysomething
                    [post_date] => 2019-11-12
                )

            [4] => Array
                (
                    [id] => 5
                    [post_id] => 5
                    [text] => xysomething
                    [post_date] => 2019-11-13
                )

        )

    ['2019-01-01' AND '2019-01-11'] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [post_id] => 6
                    [text] => xysomething
                    [post_date] => 2019-01-01
                )

            [1] => Array
                (
                    [id] => 2
                    [post_id] => 7
                    [text] => xysomething
                    [post_date] => 2019-01-05
                )

            [2] => Array
                (
                    [id] => 3
                    [post_id] => 8
                    [text] => ysomething
                    [post_date] => 2019-01-06
                )

            [3] => Array
                (
                    [id] => 4
                    [post_id] => 9
                    [text] => xsomething
                    [post_date] => 2019-01-10
                )

            [4] => Array
                (
                    [id] => 5
                    [post_id] => 10
                    [text] => ysomething
                    [post_date] => 2019-01-11
                )

        )

)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM