Phinlodaのいつか読んだ本

実際に読んでみた本の寸評・奇評(笑)

雑記

とりあえずクエリの話がよく分からなくなっているのでそちらの話を書きます。

こんな感じのテーブルがあるとします。

CREATE TABLE `mdb` (
  `id` int(11) unsigned NOT NULL,
  `created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `created` (`created`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

created には公開日時が入っています。面倒なので日だけ書きますが、10/1、10/2、10/3、…、10/22 がレコードに入っているとします。今月は昨日まで公開しているので、ここまで入っています。ちなみに 2009年4月1日あたりから入っていて、現在 4602レコードあります。

§

例えば、10/10 のデータの created が '2021-10-10' だとして、このデータは次のようなクエリで取得できます。

SELECT * FROM `mdb` WHERE `created`='2021-10-10';

10/15 のデータなら、次のようにすればokです。

SELECT * FROM `mdb` WHERE `created`='2021-10-15';

これを1回のクエリで取り出すには、次のようにすればいいでしょう。

SELECT * FROM `mdb` WHERE `created` IN ('2021-10-10','2021-10-15');

§

今回欲しいのは、あるレコードの直前の created が入っているレコードです。例えば、10/10 のデータの直前のデータを知りたい場合、次のクエリを実行すれば取り出せます。

SELECT * FROM `mdb` WHERE `created`<'2021-10-10' ORDER BY `created` DESC LIMIT 1;

10/15 のデータの直前のデータも欲しいなら、次のようにすればokです。

SELECT * FROM `mdb` WHERE `created`<'2021-10-15' ORDER BY `created` DESC LIMIT 1;

さて、ここからが本題です。10/10と10/15のデータをINで一度に取り出したように、10/10の直前のデータと、10/15の直前のデータを1つのクエリで取り出すにはどうすればよいか?

条件として、同じ値の `created` を持つレコードは複数存在しないこととします。ただし、レコードが存在しない日付が途中にあるかもしれません。