【问题标题】:MYSQL get all posts grouped by dateMYSQL 获取按日期分组的所有帖子
【发布时间】:2020-11-18 20:11:40
【问题描述】:

我想获取我数据库中的所有帖子并返回它们,按日期分组(年 -> 月 -> 日 -> 当天的帖子)。

我目前的数据库结构:

ID, author, title, content, created_at

可能的值可以是:

1, 1, "hello world", "This is the content", "2020-07-27 09:15:57"
2, 1, "Another post", "Another post content", "2020-07-27 11:09:55"
3, 1, "Third post", "No content", "2020-07-28 08:15:20"
...etc

我想要实现的是,获取所有这些帖子,但按日期(年、月、日)对它们进行分组。 即:

[2020] => [
   [7] => [
      [27] => [
         [ID] => 1,
         [ID] => 2,
      ],
      [28] => [
         [ID] => 3,
      ]
   ]
]

到目前为止我尝试过的:

SELECT id FROM my_posts_table WHERE author = 1 GROUP BY created_at ORDER BY created_at ASC

SELECT id, YEAR(created_at) as year, MONTH(created_at) as month, DAY(created_at) as day FROM my_posts_table WHERE author = 1 GROUP BY year, month, day ORDER BY year, month, day ASC

我的预期结果将是我想要实现的上述示例。但我实际上得到的是:

[0] => [
   [ID] => 1,
   [year] => 2020,
   [month] => 7,
   [day] => 27
],
[1] => [
   [ID] => 3,
   [year] => 2020,
   [month] => 7,
   [day] => 28
]

此时我完全糊涂了,因为我认为“GROUP BY”按预期工作,但它似乎以不同的方式工作。

你们能指出我正确的方向吗?我希望很清楚我想要达到的目标。 但如果不是,这里又是:“我想从 my_posts_table 中获取 author_id = 1 的所有帖子,并按年 -> 月 -> 日 -> 帖子返回”,所以“27”天的每个帖子都应该在 [27] 键下..

编辑:我按要求创建了SQLFiddle

【问题讨论】:

  • 添加示例小提琴(或至少 CREATE TABLE + INSERT INTO 带有示例数据的脚本)并为此数据显示所需的输出(MySQL 输出!!!不是它在应用程序端的 JSON 表示)。跨度>
  • 让我们说如果你能得到你想要的输出,你打算用它做什么?导出到电子表格(xls、xml 等)或在网页中显示?或者..?
  • @tcadidot0 这就是这个问题的目的。正确获取 MySQL 查询。如何在页面上显示它很容易。只是得到想要的结果是我一直在努力实现的目标
  • 这对于 SQL 查询来说并不是真正的工作。 SQL 查询不返回“嵌套数组”,它们返回all 具有相同结构的记录。构建您想要的数据结构是您从数据库中查询数据之后需要进行的处理,无论您使用哪种编程语言来进一步处理/处理此结果。
  • 您所显示的结果是不可能的,顺便说一句。 (假设它应该是一个 PHP 数组或类似的东西。)你不能在 2020 -> 7 -> 27 下拥有密钥 ID twice

标签: mysql sql arrays json database


【解决方案1】:

使用GROUP_CONCAT

对于您的 SQLFiddle 示例,请尝试以下操作:

SELECT GROUP_CONCAT(id), 
YEAR(created_at) as year, MONTH(created_at) as month, DAY(created_at) as day 
FROM my_posts_table 
WHERE author = 1 
GROUP BY year, month, day ORDER BY year, month, day ASC

【讨论】:

    【解决方案2】:

    数据库查询始终返回由行和列组成的“平面”结果集。如果你想要一些嵌套的数据结构,那么一种方法是编写一个标量查询,它只返回包含 JSON 对象的一行和一列。

    这将涉及多个级别的聚合,以及 JSON 函数 JSON_ARRAYAGG()JSON_OBJECT()

    select json_object(created_year, json_arrayagg(obj)) obj
    from (
        select 
            created_year, 
            json_object(created_month, json_arrayagg(obj)) obj      
        from (
            select 
                year(created_at)  created_year,
                month(created_at) created_month, 
                json_object(day(created_at), json_arrayagg(id)) obj
            from my_post_table
            group by year(created_at), month(created_at), day(created_at)
        ) t
        group by created_year, created_month
    ) t
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多