【问题标题】:MySQL: How to get records even when no record on the date?MySQL:即使日期没有记录,如何获取记录?
【发布时间】:2014-11-26 17:33:23
【问题描述】:

为了生成图表,我每天都会获得访问次数。即使有零条记录,我也想获得计数为 0 的记录。

我计划创建一个包含每天的表,并且在获取时 - 数据将与该表连接并从访问表中获取记录数。在 mySQL 中还有其他方法可以做到这一点吗?

访问带有示例数据的表格

Date       | ........  
----------------------
01/11/2014 | --------
03/11/2014 | --------

即使 02/11/2014 计数为 0,我也想要结果。如果我按日期分组 - 我只会在特定日期存在记录时获得计数。

【问题讨论】:

  • 为什么在没有记录的情况下调用这个db或者屏幕显示的代码不能显示0或者默认信息?
  • 为什么不使用日期列和每天分组?
  • 你能举例说明你的意思吗?
  • 即使没有记录,我也希望每个日期的计数为 0。因此,当我按日期列分组时,当日期没有记录时,将不会得到记录。
  • 您需要生成一个日期表,请参见此处stackoverflow.com/questions/10132024/…,然后将您的表左连接到此表。

标签: mysql sql


【解决方案1】:

我会尝试在你的问题的两行之间阅读......我在其中写下问题和答案的游戏:-/

您有一个表 (my_stats) 包含两个字段,一个是日期 (my_date),另一个是整数 (my_counter)。

从某种意义上说,您需要一个表格,其中包含您想在输出中使用的所有日期的列表。 这可以通过临时表来完成......(但并非所有托管解决方案都允许您这样做)另一个是使用视图或存储过程即时构建它。 然后,您将根据日期字段将此表/视图/存储过程/等...添加到您的表my_visits。 这将为您输出所有日期,并且当 mour my_visits 中没有匹配时,您将有一个 NULL 值。 (IFNULL(my_visits.my_counter, 0) 在没有匹配值时会给你一个 0(零)。

灵感: Get a list of dates between two dates + How to get list of dates between two dates in mysql select query 和一个不错的解决方案,不需要循环、过程或临时表 generate days from date range

根据最后一个链接,我们开始...

首先是一个示例表

DROP TABLE IF EXISTS `my_stats`;
CREATE TABLE IF NOT EXISTS `my_stats` (
  `my_date` date NOT NULL,
  `my_counter` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;

INSERT INTO `my_stats` (`my_date`, `my_counter`) VALUES
('2017-11-01', 2),
('2017-11-02', 3),
('2017-11-03', 5),
('2017-11-05', 3),
('2017-11-07', 7);

现在是一个工作示例BETWEEN '2017-11-01' AND '2017-11-09'

SELECT date_range.date                AS the_date, 
       IFNULL(my_stats.my_counter, 0) AS the_counter 
FROM (
    SELECT a.date 
    FROM (
        SELECT Curdate() - 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 '2017-11-01' AND '2017-11-09'
    ) AS date_range 
   LEFT JOIN my_stats 
          ON( date_range.date = my_stats.my_date ) 
ORDER  BY the_date ASC

输出

+------------+-------------+
| the_date   | the_counter |
+------------+-------------+
| 2017-11-01 |           2 |
| 2017-11-02 |           3 |
| 2017-11-03 |           5 |
| 2017-11-04 |           0 |
| 2017-11-05 |           3 |
| 2017-11-06 |           0 |
| 2017-11-07 |           7 |
| 2017-11-08 |           0 |
| 2017-11-09 |           0 |
+------------+-------------+

【讨论】:

    猜你喜欢
    • 2019-11-28
    • 1970-01-01
    • 2023-04-07
    • 2017-05-25
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2010-11-06
    • 2021-04-03
    相关资源
    最近更新 更多