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 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-01-01" và "2010-01-02" 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 HH:MM:SS). Trong ví dụ này, tôi đã trừ giá trị NUMBERS.id vào CURRENT_DATE để nhận danh sách các giá trị ngày tuần tự cho tuần trước -
SELECT x.dt FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x
-
THAM GIA TRÁI vào bảng dữ liệu của bạn dựa trên phần ngày giờ.
SELECT x.dt, COUNT(v.aid) AS num FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x LEFT JOIN VOTES v ON DATE(FROM_UNIXTIME(v.timestamp)) = DATE(x.dt) GROUP BY x.dt ORDER BY x.dt
Tại sao lại là Số, không phải Ngày?
Đơn giản - ngày tháng có thể được tạo dựa trên số, như trong ví dụ tôi đã cung cấp. Nó cũng có nghĩa là sử dụng một bảng duy nhất, so với một bảng cho mỗi loại dữ liệu.
Trước đây:
SELECT DATE(FROM_UNIXTIME(v.timestamp)) AS dt,
COUNT(v.aid)
FROM VOTES v
WHERE DATE(FROM_UNIXTIME(v.timestamp)) BETWEEN DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY)
AND CURRENT_DATE
GROUP BY DATE(FROM_UNIXTIME(v.timestamp))