Om jag inte missar något är svaret förvånansvärt enkelt. Jag hade inte insett att UNION kan sorteras på vanliga kolumner genom att använda ett alias, även om dessa kolumner är från olika tabeller. Så hela frågan skulle vara: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 har påpekats att det är en risk att använda en tabell för att slå upp datum eftersom datumen så småningom kommer att ta slut, vilket är sant, men att beräkna om ett datum är till exempel den första måndagen i en månad (eller den andra eller fjärde eller kanske fjärde och sista), verkar vara en mer komplex bit av SQL-kod än jag vill komma in på just nu.