Đây là giải pháp của tôi cho vấn đề này bằng cách sử dụng CTE
WITH RECURSIVE CTE(attendanceDate)
AS
(
SELECT * FROM
(
SELECT attendanceDate FROM attendance WHERE attendanceDate = current_date
OR attendanceDate = current_date - INTERVAL '1 day'
ORDER BY attendanceDate DESC
LIMIT 1
) tab
UNION ALL
SELECT a.attendanceDate FROM attendance a
INNER JOIN CTE c
ON a.attendanceDate = c.attendanceDate - INTERVAL '1 day'
)
SELECT COUNT(*) FROM CTE;
Kiểm tra mã tại SQL Fiddle
Đây là cách truy vấn hoạt động:
- Nó chọn bản ghi của ngày hôm nay từ
attendance
bàn. Nếu bản ghi của ngày hôm nay không có sẵn thì nó sẽ chọn bản ghi của ngày hôm qua - Sau đó, nó tiếp tục thêm bản ghi đệ quy một ngày trước ngày ít nhất
Nếu bạn muốn chọn phạm vi ngày liên tiếp mới nhất bất kể lần tham dự gần đây nhất của người dùng là khi nào (hôm nay, hôm qua hoặc x ngày trước), thì phần khởi tạo của CTE phải được thay thế bằng đoạn mã dưới đây:
SELECT MAX(attendanceDate) FROM attendance
[EDIT] Đây là truy vấn tại SQL Fiddle giải quyết câu hỏi số 1 của bạn: SQL Fiddle