mysqlで連番を生成しようとすると以外と難しいです。
再起CTEなんかでやらないといけないかなと。
mariadbではsequence storage engineの機能を使うと、とてもかんたんです。
https://mariadb.com/kb/en/sequence-storage-engine
に書いてあるとおりです。
↓の感じですね。
> select * from seq_1_to_10;
+-----+
| seq |
+-----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+-----+
なんで連番を生成したいかというと、歯抜けが許されない場合があるからですね。
たとえば、↓のような状況だったとします。
> CREATE TABLE `active` (
`ymd` date NOT NULL,
`cnt` int(11) NOT NULL,
PRIMARY KEY (`ymd`)
);
> select * from active;
+------------+-----+
| ymd | cnt |
+------------+-----+
| 2024-10-01 | 10 |
| 2024-10-02 | 7 |
| 2024-10-04 | 11 |
+------------+-----+
見てのとおり、「2024-10-03」のデータがありません。
ここで連番テーブルとLEFT JOINすることで、
「2024-10-03」を「0」として計上できます。
↓の感じですね。
> with
t as
(
select date('2024-10-01') + interval seq day as ymd from seq_0_to_3
)
select
t.ymd as ymd,
coalesce(active.cnt, 0) as cnt
from
t
left outer join
active
on t.ymd = active.ymd
order by
t.ymd
;
+------------+------+
| ymd | cnt |
+------------+------+
| 2024-10-01 | 10 |
| 2024-10-02 | 7 |
| 2024-10-03 | 0 |
| 2024-10-04 | 11 |
+------------+------+
まあ、今更ですが、意外と連番生成は求められるので、
mariadbであるなら、sequence storage engineをつかうと楽ですよ、ってことですかね。
以上
コメントがあればどうぞ