sql >> データベース >  >> RDS >> Mysql

過去7日間のMySQLカウントデータ

    MySQLには再帰機能がないため、NUMBERSテーブルトリックを使用する必要があります-

    1. 増分数のみを保持するテーブルを作成します-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;
      
    2. 次を使用してテーブルにデータを入力します:

      INSERT INTO NUMBERS
        (id)
      VALUES
        (NULL)
      

      ...必要な数の値に対して。

    3. 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
      
    4. 日時部分に基づいてデータのテーブルに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))
    


    1. DD-Mon-YY形式でmySQLに日付を挿入できますか?

    2. RMANリストバックアップコマンド

    3. php接続プールmysql

    4. OracleデータベースでEXECUTEIMMEDIATEを使用してCreateTableDDLを実行する方法