Mysql
 sql >> Base de données >  >> RDS >> Mysql

Événements récurrents, requête SQL

À moins que quelque chose ne me manque, la réponse est étonnamment simple. Je n'avais pas réalisé que les UNION peuvent être triées sur des colonnes communes en utilisant un alias, même si ces colonnes proviennent de tables différentes. Ainsi, la requête complète serait :

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;

Il a été souligné que l'utilisation d'un tableau pour rechercher des dates est un risque car les dates finiront par s'épuiser, ce qui est vrai, mais calculer si une date est, par exemple, le premier lundi d'un mois (ou le deuxième ou le quatrième ou peut-être quatrième et dernier), semble être un morceau de code SQL plus complexe que ce que je veux aborder pour le moment.