Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Eventos recorrentes, consulta SQL


A menos que eu esteja perdendo alguma coisa, a resposta é surpreendentemente simples. Eu não tinha percebido que UNIONs podem ser classificados em colunas comuns usando um alias, mesmo que essas colunas sejam de tabelas diferentes. Portanto, a consulta completa seria:
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;


Foi apontado que usar uma tabela para pesquisar datas é um risco porque as datas acabarão eventualmente, o que é verdade, mas calcular se uma data é, por exemplo, a primeira segunda-feira de um mês (ou a segunda ou quarta ou talvez o quarto e último), parece um código SQL mais complexo do que quero abordar no momento.