bisognerebbe vedere un esempio di cosa stampi per capire qualcosa in piu'.

Se devi estrarre "tutti" gli appuntamenti di un certo user ... estrai tutti gli appuntamenti. Che c'entra di che tipo sono, tutti sono tutti. Se li devi dividere per tipo che ti piaccia o no questa divisione e' un ordinamento. I record che estrai hanno un range di tempo? da data_inizio a data_fine?

Tutte quelle union sui record della stessa tabella altro non vorrebbero essere che una successione ordinata di record divisi per tipologia.

vediamo la tabella:

id | rif_acc | data_in | data_fi | ripetibile | tipo_ripetizione | giorno_mese | giorno_settimana | rip_sempre | data_fine_rip | titolo | desc

gli eventi possono essere:

1 - non si ripetono.
2 - si ripetono in base al giorno xx(es ogni 1 del mese) per sempre
3 - si ripetono in base al giorno xx(es ogni 1 del mese) fino alla data xx.xx.xx
4 - si ripetono in base al giorno della settimana(es ongi lun o mart etcc.) per sempre
5 - si ripetono in base al giorno della settimana(es ongi lun o mart etcc.) fino alla data xx.xx.xx
come identificarli
codice:
1 - where curdate() = data_in and curdate() = data_fi
(metti nel db data_in = data_fi  questo vale per tutti gli eventi che non si ripetono)

2 - where dayofmonth(data_in) = 1 AND data_fi = '0000-00-00'
(1 = primo del mese) -- data_fi sara' 0000-00-00 per tutti gli eventi che si ripetono

3 - where dayofmonth(data_in) = 1 AND curdate() <= data_fi

4 - where dayofweek(data_in) = 3 AND data_fi = '0000-00-00'
(3 = martedi')

4 - where dayofweek(data_in) = 3 AND curdate() <= data_fin  (3 = martedi')
questa dovrebbe essere la base per selezionare i record. tutti i seguenti campi potrebbero essere descrittivi ma sono campi ripetuti e direi inutili.

| ripetibile | tipo_ripetizione | giorno_mese | giorno_settimana | rip_sempre | data_fine_rip

basta un solo campo "tipo_ripetizione"

se devi mettere dei commenti mettili nella visualizzazione allo user in base alla query che esegui. Non sono dati che possano interessare un database.

riassumendo:

evento unico -> data_in = data_fi
evento eterno -> data_in = data inizio, data_fi = 0000-00-00
evento limitato -> data_in = data inizio, data_fi = data scadenza

tipo_ripetizione --- potresti usare un codice Es.:
0-0 = non ripetibile
1-4 --> 1 = ripetibile mensile - 4=giorno del mese
2-5 --> 2 = ripetibile settimanale 5= giorno della settimana

nel where aggiungerai ad esempio .... and tipo_ripetizione = '1-4'

puoi anche fare una UNION ma anche fare 4 o 5 query select che e' poi la stessa cosa.