Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wiederkehrende Ereignisse, SQL-Abfrage

Wenn ich nichts übersehe, ist die Antwort überraschend einfach. Ich hatte nicht bemerkt, dass UNIONs mithilfe eines Alias ​​nach gemeinsamen Spalten sortiert werden können, selbst wenn diese Spalten aus verschiedenen Tabellen stammen. Die vollständige Abfrage wäre also:

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;

Es wurde darauf hingewiesen, dass die Verwendung einer Tabelle zum Nachschlagen von Daten ein Risiko darstellt, da die Daten irgendwann auslaufen, was wahr ist, aber zu berechnen, ob ein Datum beispielsweise der erste Montag in einem Monat ist (oder der zweite oder vierte oder vielleicht vierter und letzter), scheint ein komplexeres Stück SQL-Code zu sein, als ich im Moment darauf eingehen möchte.