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

Tilbagevendende hændelser, SQL-forespørgsel

Medmindre jeg går glip af noget, er svaret overraskende enkelt. Jeg havde ikke indset, at UNIONs kan sorteres på almindelige kolonner ved at bruge et alias, selvom disse kolonner er fra forskellige tabeller. Så den fulde forespørgsel ville være:

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;

Det er blevet påpeget, at det er en risiko at bruge en tabel til at slå datoer op, fordi datoerne i sidste ende vil løbe ud, hvilket er sandt, men ved at beregne om en dato for eksempel er den første mandag i en måned (eller den anden eller fjerde) eller måske fjerde og sidste), virker som en mere kompleks bit SQL-kode, end jeg ønsker at komme ind på i øjeblikket.



  1. Betinget WHERE-klausul med CASE-sætning i Oracle

  2. Slut dig til mig tirsdag den 9. april for de seneste Microsoft Access-nyheder

  3. Hvordan MariaDB opnår global skala med Xpand

  4. mySQL:Underforespørgsel til array?