2

たとえば、このようなテーブルがある場合

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
50      2010-01-05

このような出力を取得するためにselectステートメントを作成するにはどうすればよいですか?

total   date
10      2010-01-01
15      2010-01-02
98      2010-01-03
0       2010-01-04
50      2010-01-05
4

1 に答える 1

1

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)
    

    ...必要な数の値に対して。この場合、INSERTステートメントは少なくとも31回実行する必要があります。

  3. DATE_ADDを使用して、NUMBERS.id値に基づいて増加する日のリストを作成します。

    SELECT x.dt
      FROM (SELECT DATE(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-01-05' ) x
    
  4. OUTER JOINを使用して、目的の出力を取得します。

       SELECT x.dt,
              COUNT(*) AS total
         FROM (SELECT DATE(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-01-05' ) x
    LEFT JOIN YOUR_TABLE y ON y.date = x.dt
     GROUP BY x.dt
     ORDER BY x.dt
    

なぜ日付ではなく数字なのか?

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

于 2011-05-13T01:53:08.267 に答える