首页 > 解决方案 > MYSQL 插入缺少日期的行

问题描述

我有一个有两列的表:

姓名 日期
AA 2021-06-01
BB 2021-06-02
抄送 2021-05-28

我想编写一个代码来添加具有名称和日期的行,直到今天(2021-06-03)日期,如下所示:

姓名 日期
AA 2021-06-01
AA 2021-06-02
AA 2021-06-03
BB 2021-06-02
BB 2021-06-03
抄送 2021-05-28
抄送 2021-05-29
抄送 2021-05-30
抄送 2021-05-31
抄送 2021-06-01
抄送 2021-06-02
抄送 2021-06-03

我没有使用递归函数,所以不确定这里最好的做法是什么。任何正确方向的帮助或指示将不胜感激。谢谢 :)

标签: mysqlsqldaterecursive-query

解决方案


对于最新版本的 MySQL,您可以...

DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(name CHAR(2) NOT NULL
,date DATE NOT NULL
,PRIMARY KEY(name,date)
);

INSERT INTO my_table VALUES
('AA','2021-06-01'),
('BB','2021-06-02'),
('CC','2021-05-28');

WITH RECURSIVE cte AS
(
  SELECT MIN(date) date FROM my_table 
   UNION ALL
  SELECT date + INTERVAL 1 DAY 
    FROM cte
   WHERE date + INTERVAL 1 DAY <= '2021-06-03'
)
SELECT x.name
     , cte.date
  FROM my_table x
  JOIN cte
    ON cte.date >= x.date
 ORDER 
    BY name
     , date


| name | date       |
| ---- | ---------- |
| AA   | 2021-06-01 |
| AA   | 2021-06-02 |
| AA   | 2021-06-03 |
| BB   | 2021-06-02 |
| BB   | 2021-06-03 |
| CC   | 2021-05-28 |
| CC   | 2021-05-29 |
| CC   | 2021-05-30 |
| CC   | 2021-05-31 |
| CC   | 2021-06-01 |
| CC   | 2021-06-02 |
| CC   | 2021-06-03 |

---

[View on DB Fiddle](https://www.db-fiddle.com/f/wL3ZqXoTqdKftJCPA4um4j/1)     

对于旧版本,您可以使用实用程序表。例如,我有一个整数表 (i),其值从 0 到 9...

SELECT y.name
     , x.date 
  FROM 
     ( SELECT MIN(date) + INTERVAL i DAY date FROM my_table,ints GROUP BY i HAVING date <= '2021-06-03' ) x 
  JOIN my_table y 
    ON y.date <= x.date 
 ORDER 
    BY name
     , date;
+------+------------+
| name | date       |
+------+------------+
| AA   | 2021-06-01 |
| AA   | 2021-06-02 |
| AA   | 2021-06-03 |
| BB   | 2021-06-02 |
| BB   | 2021-06-03 |
| CC   | 2021-05-28 |
| CC   | 2021-05-29 |
| CC   | 2021-05-30 |
| CC   | 2021-05-31 |
| CC   | 2021-06-01 |
| CC   | 2021-06-02 |
| CC   | 2021-06-03 |
+------+------------+

推荐阅读