MySQL tidak memiliki fungsi rekursif, jadi Anda tinggal menggunakan trik tabel ANGKA -
-
Buat tabel yang hanya menampung angka yang bertambah - mudah dilakukan menggunakan 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;
-
Isi tabel menggunakan:
INSERT INTO NUMBERS (id) VALUES (NULL)
...untuk nilai sebanyak yang Anda butuhkan.
-
Gunakan DATE_ADD untuk membuat daftar tanggal, menambah hari berdasarkan nilai NUMBERS.id. Ganti "01-01-01" dan "01-01-02" dengan tanggal mulai dan akhir masing-masing (tetapi gunakan format yang sama, YYYY-MM-DD HH:MM:SS). Dalam contoh ini, saya mengurangi nilai NUMBERS.id dari CURRENT_DATE untuk mendapatkan daftar nilai tanggal berurutan untuk minggu lalu -
SELECT x.dt FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x
-
LEFT JOIN ke tabel data Anda berdasarkan porsi datetime.
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
Mengapa Angka, bukan Tanggal?
Sederhana - tanggal dapat dibuat berdasarkan nomor, seperti pada contoh yang saya berikan. Ini juga berarti menggunakan satu tabel, vs katakan satu per tipe data.
Sebelumnya:
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))