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
come identificarligli 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
questa dovrebbe essere la base per selezionare i record. tutti i seguenti campi potrebbero essere descrittivi ma sono campi ripetuti e direi inutili.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')
| 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.