Tôi sẽ tạo một bảng kiểm đếm chỉ với một cột có tên là id
và điền vào bảng đó với các số từ 0 đến 500. Giờ đây, chúng tôi dễ dàng sử dụng nó để thực hiện các lựa chọn thay vì sử dụng vòng lặp while.
Id
-------------------------------------
0
1
2
etc...
Sau đó, tôi sẽ lưu trữ các sự kiện trong một bảng với Name as varchar
, startdate as datetime
và repeats as int
Name | StartDate | Repeats
-------------------------------------
Meeting | 2012-12-10 00:00:00 | 7
Lunch | 2012-12-10 00:00:00 | 1
Bây giờ chúng ta có thể sử dụng bảng kiểm đếm để chọn tất cả các ngày giữa hai ngày bằng cách sử dụng:
SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
FROM `tally`
WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
ORDER BY Id ASC
ShowDate
-------------------------------------
2012-12-09 00:00:00
2012-12-10 00:00:00
2012-12-11 00:00:00
2012-12-12 00:00:00
2012-12-13 00:00:00
2012-12-14 00:00:00
2012-12-15 00:00:00
2012-12-16 00:00:00
2012-12-17 00:00:00
2012-12-18 00:00:00
2012-12-19 00:00:00
2012-12-20 00:00:00
Sau đó, chúng tôi kết hợp điều này trên bảng sự kiện để tính toán sự khác biệt giữa ngày bắt đầu và ngày chiếu. Chúng tôi đã đưa ra kết quả của việc này bằng các repeats
và nếu phần còn lại là 0
, chúng tôi phù hợp.
Tất cả kết hợp trở thành:
SELECT E.Id, E.Name, E.StartDate, E.Repeats, A.ShowDate, DATEDIFF(E.StartDate, A.ShowDate) AS diff
FROM events AS E, (
SELECT DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY) as showdate
FROM `tally`
WHERE (DATE_ADD('2012-12-09 00:00:00',INTERVAL Id DAY)<='2012-12-20 00:00:00')
ORDER BY Id ASC
) a
WHERE MOD(DATEDIFF(E.StartDate, A.ShowDate), E.Repeats)=0
AND A.ShowDate>=E.StartDate
Kết quả là
Id | Name |StartDate | Repeats | ShowDate | diff
---------------------------------------------------------------------------------
1 | Meeting | 2012-12-10 00:00:00 | 7 | 2012-12-10 00:00:00 | 0
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-10 00:00:00 | 0
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-11 00:00:00 | -1
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-12 00:00:00 | -2
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-13 00:00:00 | -3
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-14 00:00:00 | -4
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-15 00:00:00 | -5
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-16 00:00:00 | -6
1 | Meeting | 2012-12-10 00:00:00 | 7 | 2012-12-17 00:00:00 | -7
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-17 00:00:00 | -7
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-18 00:00:00 | -8
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-19 00:00:00 | -9
2 | Lunch | 2012-12-10 00:00:00 | 1 | 2012-12-20 00:00:00 | -10
Bây giờ bạn có thể (và nên làm!) Tăng tốc mọi thứ. Ví dụ:bằng cách lưu trữ trực tiếp ngày tháng trong bảng để bạn có thể chọn trực tiếp tất cả các ngày thay vì sử dụng bảng kiểm đếm với dateadd. Mọi thứ bạn có thể lưu vào bộ nhớ cache và không phải tính toán lại đều tốt.