首页 > 解决方案 > 从数据库的第一个日期到今天获取数据

问题描述

我想按日期对数据进行分组并在图表上查看。这是我的数据示例:

count                            created_at
-----                            ----------
 5                               2020/04/20
 4                               2020/04/21
 3                               2020/04/25
 9                               2020/04/28

我希望我获取的数据像

count                            created_at
-----                            ----------
 5                               2020/04/20
 4                               2020/04/21
 0                               2020/04/22
 0                               2020/04/23
 0                               2020/04/24
 3                               2020/04/25
 0                               2020/04/26
 0                               2020/04/27
 9                               2020/04/28

当该日期没有数据时,它将显示 0。你们能帮我如何在 laravel 控制器上获取它吗?

之前谢谢。

标签: mysqllaraveleloquent

解决方案


@Alun 这里是你如何做到这一点的一个例子:

SELECT `dateList`.`Date`,
    CASE WHEN `yt`.`date` IS NULL THEN 0
    ELSE COUNT(`yt`.`id`) 
    END AS `amt`
FROM

-- this is the part you can copy/paste 
-- to be used to left join in a table of your choice 
-- ---------------------------------------------------------------------------------------------------------------------------
(
    SELECT DATE(`a`.`Date`) AS `Date`
    FROM (
        SELECT NOW() - INTERVAL (`a`.`a` + (10 * `b`.`a`) + (100 * `c`.`a`)) DAY AS `Date`
        FROM (SELECT 0 AS `a` UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS `a`
        CROSS JOIN (SELECT 0 AS `a` UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS `b`
        CROSS JOIN (SELECT 0 AS `a` UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) AS `c`
    ) AS `a` 
    WHERE `a`.`Date` BETWEEN '2020-04-01' AND NOW()
) AS `dateList` 
-- ---------------------------------------------------------------------------------------------------------------------------

LEFT JOIN `yourTable` AS `yt` ON `dateList`.`Date` = DATE(`yt`.`date`)
GROUP BY `dateList`.`Date`
ORDER BY `dateList`.`Date` ASC

只需yourTable在此查询中替换您的表名称(相应地修改表中的日期列名称替换yt.date),这将为您提供该月中每一天的列表,该列表显示该月中没有任何日期的 0价值。

至于在 Laravel 控制器中使用 eloquent 来实现这一点,这可能是可能的,但我不知道你会怎么做。你可以在控制器中使用这个原始 SQL 来完成你想要的。

这是它在 sql fiddle 中如何工作的示例。

希望这可以帮助!


推荐阅读