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

MySQLは現在のストリークの連続した日付をカウントします

    クエリはストリークカウントを変数に保持し、ギャップがあるとすぐにカウントを大きな負の値にリセットします。次に、最大のストリークを返します。

    ユーザーの投票数によっては、-99999を変更する必要がある場合があります より大きな(負の)値に。

    select if(max(maxcount) < 0, 0, max(maxcount)) streak
    from (
    select 
      if(datediff(@prevDate, datecreated) = 1, @count := @count + 1, @count := -99999) maxcount,
      @prevDate := datecreated
      from votes v cross join 
        (select @prevDate := date(curdate() + INTERVAL 1 day), @count := 0) t1
      where username = 'bob'
      and datecreated <= curdate()
      order by datecreated desc
    ) t1;
    

    http://sqlfiddle.com/#!2/37129/6

    更新

    別のバリエーション

    select * from (
    select datecreated, 
      @streak := @streak+1 streak, 
      datediff(curdate(),datecreated) diff
    from votes 
    cross join (select @streak := -1) t1
    where username = 'bob'
    and datecreated <= curdate()
    order by datecreated desc
    ) t1 where streak = diff
    order by streak desc limit 1
    

    http://sqlfiddle.com/#!2/c6dd5b/20

    この投稿の日付で実行された場合にのみ、フィドルは正しいストリークを返すことに注意してください:)

    アップデート2

    以下のクエリは、重複する日付が削除された派生テーブルから選択することにより、同じユーザーが1日に複数の投票を許可するテーブルで機能します。

    select * from (
      select date_created, 
      @streak := @streak+1 streak, 
      datediff(curdate(),date_created) diff
      from (
        select distinct date(date_created) date_created
        from votes where username = 'pinkpopcold'
      ) t1
      cross join (select @streak := -1) t2
      order by date_created desc
      ) 
    t1 where streak = diff
    order by streak desc limit 1
    

    http://sqlfiddle.com/#!2/5fc6d/7

    select *を置き換えることをお勧めします select streak + 1を使用 連勝に最初の投票を含めるかどうかによって異なります。



    1. MySQLデータベースで検索するときに「%」記号に一致する

    2. SQLite-データの更新

    3. mysqlのテーブルから重複する行を削除する方法

    4. LinuxにSQLServerAlwaysOn可用性グループを展開する