Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL đếm các ngày liên tiếp cho chuỗi hiện tại

Truy vấn giữ số lượng vệt trong một biến và ngay sau khi có khoảng trống, nó sẽ đặt lại số lượng thành số âm lớn. Sau đó, nó trả về chuỗi lớn nhất.

Tùy thuộc vào số lượng phiếu bầu mà người dùng có thể có, bạn có thể cần thay đổi -99999 thành một giá trị lớn hơn (âm).

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

Cập nhật

Một biến thể khác

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

Lưu ý, fiddle sẽ chỉ trả về các vệt chính xác nếu được chạy vào ngày đăng bài viết này :)

Cập nhật 2

Truy vấn bên dưới hoạt động với các bảng cho phép nhiều phiếu bầu mỗi ngày bởi cùng một người dùng bằng cách chọn từ bảng dẫn xuất nơi các ngày trùng lặp được xóa.

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

Bạn có thể muốn thay thế select * với select streak + 1 tùy thuộc vào việc bạn có muốn bao gồm phiếu bầu đầu tiên trong chuỗi hay không.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ngày PHP ('W') so với MySQL YEARWEEK (bây giờ ())

  2. Chuyển đổi một đối tượng thành một chuỗi trong PHP

  3. Woocommerce nhận Mã sản phẩm bằng SKU sản phẩm

  4. Tránh lặp lại JTextField setText xung quanh chương trình

  5. Truy vấn để tìm các bài đăng có tập hợp thẻ chính xác (mối quan hệ nhiều-nhiều)