A menos que me esté perdiendo algo, la respuesta es sorprendentemente simple. No me había dado cuenta de que las UNIONES se pueden ordenar en columnas comunes usando un alias, incluso si esas columnas son de tablas diferentes. Entonces, la consulta completa sería: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;
Se ha señalado que usar una tabla para buscar fechas es un riesgo porque eventualmente se acabarán las fechas, lo cual es cierto, pero calcular si una fecha es, por ejemplo, el primer lunes de un mes (o el segundo, o cuarto o tal vez el cuarto y último), parece un código SQL más complejo de lo que quiero abordar en este momento.