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 NUMBERS (id) VALUES (NULL)
...必要な数の値に対して。
-
DATE_ADD> 日付のリストを作成し、NUMBERS.id値に基づいて日数を増やします。 「2010-01-01」と「2010-01-02」をそれぞれの開始日と終了日に置き換えます(ただし、同じ形式YYYY-MM-DD HH:MM:SSを使用します)。この例では、CURRENT_DATEからNUMBERS.id値を減算して、先週の連続する日付値のリストを取得しました-
SELECT x.dt FROM (SELECT DATE_SUB(CURRENT_DATE, INTERVAL (n.id - 1) DAY) AS dt FROM numbers n WHERE n.id <= 7 ) x
-
日時部分に基づいてデータのテーブルにLEFTJOINします。
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
日付ではなく数字を使用する理由
単純-私が提供した例のように、日付は数値に基づいて生成できます。また、データ型ごとに1つと言うのではなく、単一のテーブルを使用することも意味します。
以前:
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))