MySQLには再帰機能がないため、NUMBERSテーブルトリックを使用する必要があります-
-
増分数のみを保持するテーブルを作成します-auto_incrementを使用して簡単に実行できます:
DROP TABLE IF EXISTS `example`.`numbers`; CREATE TABLE `example`.`numbers` ( `id` int(10) unsigned NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-
次を使用してテーブルにデータを入力します:
INSERT INTO `example`.`numbers` ( `id` ) VALUES ( NULL )
...必要な数の値に対して。
-
DATE_ADD> 日付のリストを作成し、NUMBERS.id値に基づいて日数を増やします。 「2010-06-06」と「2010-06-14」をそれぞれの開始日と終了日に置き換えます(ただし、同じ形式、YYYY-MM-DDを使用します)-
SELECT `x`.* FROM (SELECT DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` -1 DAY) <= '2010-06-14' ) x
-
時間の部分に基づいてデータのテーブルに左に参加します:
SELECT `x`.`ts` AS `timestamp`, COALESCE(`y`.`score`, 0) AS `cnt` FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%m/%d/%Y') AS `ts` FROM `numbers` `n` WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x LEFT JOIN TABLE `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = `x`.`ts`
日付形式を維持する場合は、DATE_FORMAT関数 :
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`