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

MySQLの日付/作成者の比較

    日付参照テーブルを作成し、そのテーブルにデータを入力してから、LEFT OUTER JOINを作成する必要があると思います。 クエリのそのテーブルから。 「欠落している日付を表示するにはどうすればよいですか?」の問題かなり一般的なSOの質問> とにかく行きます。

    準備ステップ

    mysqlプロンプトで実行:

    use WordPress;
    

    ステップ1-日付参照テーブルを作成する

    create table all_date 
    (id int unsigned not null primary key auto_increment, 
    a_date date not null,
    last_modified timestamp not null default current_timestamp on update current_timestamp,
    unique key `all_date_uidx1` (a_date));
    

    ステップ2-日付参照テーブルに入力

    このテーブルの考え方は、日付ごとに1つの行を持つことです。これで、insertステートメントを実行することでこれを達成できますが、ルーチンを作成してデータを入力してみませんか(MySQLのスケジュールされたイベント テーブルに常に完全な日付のセットがあることを確認します。そのルーチンの提案は次のとおりです:

    DELIMITER //
    
    
    CREATE PROCEDURE populate_all_dates(IN from_date DATE, IN days_into_future INT)
    
    BEGIN
    
     DECLARE v_date DATE;
     DECLARE ix int;
    
    
     SET ix := 0;
     SET v_date := from_date;
    
    
     WHILE v_date <= (from_date + interval days_into_future day) DO
    
      insert into all_date (a_date) values (v_date) 
      on duplicate key update last_modified = now();
    
      set ix := ix +1;
    
      set v_date := from_date + interval ix day;
    
     END WHILE;
    
    END//
    
    DELIMITER ;
    

    これで実行できます:

    call populate_all_dates('2011-10-01',30);
    

    10月のすべての日付を入力するには(またはdays_into_the_futureをクランクアップします パラメータを好きなように設定します。

    関心のあるすべての日付が入力された日付参照テーブルができたので、先に進んで10月のクエリを実行できます。

    select day(a.a_date) as 'October',
    IFNULL(t.a1,0) as 'Auth1',
    IFNULL(t.a2,0) as 'Auth2',
    IFNULL(t.a50,0) as 'Auth50'
    from all_date a
    LEFT OUTER JOIN
    (
    SELECT date(wp.post_date) as post_date,
    sum(case when wp.post_author = '1' then 1 else 0 end) as a1,
    sum(case when wp.post_author = '2' then 1 else 0 end) as a2,
    sum(case when wp.post_author = '50' then 1 else 0 end) as a50,
    count(*) as 'All Auths'
    FROM wp_posts wp
    WHERE  wp.post_type = 'post'
    AND wp.post_date  between '2011-10-01' and '2011-10-31 23:59:59'
    GROUP BY date(wp.post_date)
    ) t
    ON a.a_date = t.post_date
    where a.a_date between '2011-10-01' and '2011-10-31'
    group by day(a.a_date);
    


    1. はじめにAzureSQLデータベースでのパフォーマンスの調整

    2. クエリ結果をテーブルに出力する

    3. Yii CActiveDataProviderオブジェクトを反復処理する方法は?

    4. MySQL上の@GeneratedValueポリモーフィック抽象スーパークラス