sql >> データベース >  >> RDS >> 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-03-01」をそれぞれの開始日と終了日に置き換えます(ただし、同じ形式、YYYY-MM-DDを使用します)-

      SELECT x.*
        FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY)
                FROM numbers n
               WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
      
    4. 日時部分に基づいてデータのテーブルに左参加します:

         SELECT DATE(x.dt) AS dt,
                COALESCE(SUM(e.value), 0) AS sum_value
           FROM (SELECT DATE_ADD('2010-01-01', INTERVAL n.id - 1 DAY) AS dt
                   FROM numbers n
                  WHERE DATE_ADD('2010-01-01', INTERVAL n.id -1 DAY) <= '2010-03-01' ) x
      LEFT JOIN ENTRY e ON DATE(e.datetime) = x.dt
                       AND e.entryid = 85
       GROUP BY DATE(x.dt) 
      

    日付ではなく数字を使用する理由

    単純-私が提供した例のように、日付は数値に基づいて生成できます。また、データ型ごとに1つと言うのではなく、単一のテーブルを使用することも意味します。




    1. PythonでMySQLデータベースに挿入した後にIDを取得するにはどうすればよいですか?

    2. 挿入された行を更新するためのMysqlトリガー

    3. SQL Serverでマテリアライズドビューを作成するにはどうすればよいですか?

    4. MySQLでのSELECTINTO