Trừ khi tôi thiếu thứ gì đó, câu trả lời đơn giản đến mức đáng ngạc nhiên. Tôi đã không nhận ra rằng các UNION có thể được sắp xếp trên các cột chung bằng cách sử dụng bí danh, ngay cả khi các cột đó từ các bảng khác nhau. Vì vậy, truy vấn đầy đủ sẽ là:SELECT DISTINCT(e.eventid),n.nameid,n.firstname,n.lastname,d.dt AS dait,r.recurring
FROM dates d
LEFT JOIN recurringtypes r
/* if event recurring every week E.g. 'Every Monday' */
ON (r.rectypeid BETWEEN 2 AND 8 AND r.day = d.dow)
/* if event recurring every month E.g. 'First Monday, every month' */
OR ((r.rectypeid BETWEEN 9 AND 36) AND r.day = d.dow AND r.occurrence = d.occurrence)
/* if event recurring every last week of month E.g. 'Last Monday, every month' */
OR (r.rectypeid >= 37 AND r.day = d.dow and r.islast = d.islast)
LEFT JOIN events e on e.rectypeid = r.rectypeid
LEFT JOIN eventtypes t ON e.eventtypeid = t.eventtypeid
LEFT JOIN names n ON e.namesid = n.namesid
WHERE (d.dt BETWEEN '2012/02/01' AND '2012/05/01')
UNION
SELECT e.eventid,n.nameid,n.lastname,n.firstname,e.firstdate AS dait,'No' as Recurring
FROM events e
LEFT JOIN names n ON n.names = e.namesid
AND e.rectypeid <= 1
WHERE e.firstdate BETWEEN '2012/02/01' AND '2012/05/01'
ORDER BY dait;
Người ta đã chỉ ra rằng việc sử dụng bảng để tra cứu ngày là một rủi ro vì cuối cùng ngày sẽ hết, điều này đúng, nhưng việc tính toán xem một ngày có phải là, ví dụ, thứ Hai đầu tiên trong tháng (hay thứ hai, hoặc thứ tư hoặc có thể là thứ tư và cuối cùng), có vẻ như một đoạn mã SQL phức tạp hơn tôi muốn tham gia vào lúc này.