Mysql
 sql >> Database >  >> RDS >> Mysql

Eventi ricorrenti, query SQL

A meno che non mi sfugga qualcosa, la risposta è sorprendentemente semplice. Non mi ero reso conto che le UNION possono essere ordinate su colonne comuni usando un alias, anche se quelle colonne provengono da tabelle diverse. Quindi la query completa sarebbe:

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;

È stato sottolineato che l'uso di una tabella per cercare le date è un rischio perché le date alla fine si esauriranno, il che è vero, ma calcolando se una data è, ad esempio, il primo lunedì in un mese (o il secondo o il quarto o forse il quarto e ultimo), sembra un pezzo di codice SQL più complesso di quello in cui voglio entrare in questo momento.