sql >> Databáze >  >> RDS >> Mysql

Opakující se události, SQL dotaz

Pokud mi něco neunikne, odpověď je překvapivě jednoduchá. Neuvědomil jsem si, že UNIONy lze třídit podle běžných sloupců pomocí aliasu, i když jsou tyto sloupce z různých tabulek. Celý dotaz by tedy byl:

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;

Bylo zdůrazněno, že použití tabulky pro vyhledávání termínů je riskantní, protože data nakonec dojdou, což je pravda, ale výpočet, zda je datum například první pondělí v měsíci (nebo druhé nebo čtvrté nebo možná čtvrtý a poslední), vypadá jako složitější kousek kódu SQL, než do kterého bych se v tuto chvíli chtěl dostat.



  1. Jak vytvořit novou databázi po prvotní instalaci databáze Oracle 11g Express Edition?

  2. Ukládejte procedury do phpMyAdmin

  3. Laravel MySQL, jak objednávat výsledky ve stejném pořadí jako v klauzuli whereIn

  4. SQL spojuje více hodnot ze sloupce do jedné buňky