MySQL không có chức năng đệ quy, vì vậy bạn chỉ còn cách sử dụng thủ thuật bảng NUMBERS -
-
Tạo một bảng chỉ chứa các số tăng dần - dễ thực hiện bằng cách sử dụng 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;
-
Điền vào bảng bằng cách sử dụng:
INSERT INTO `example`.`numbers` ( `id` ) VALUES ( NULL )
... cho bao nhiêu giá trị bạn cần.
-
Sử dụng DATE_ADD để tạo danh sách ngày, tăng số ngày dựa trên giá trị NUMBERS.id. Thay thế "2010-06-06" và "2010-06-14" bằng ngày bắt đầu và ngày kết thúc tương ứng của bạn (nhưng sử dụng cùng một định dạng, 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
-
THAM GIA TRÁI vào bảng dữ liệu của bạn dựa trên phần thời gian:
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`
Nếu bạn muốn duy trì định dạng ngày, hãy sử dụng Hàm DATE_FORMAT :
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`