ciao a tutti. ho una query un po troppo pesante..causa del fatto che non ho molta esperienza. mi potreste aiutare?

la query permette di recuperare gli impegni da una data_inizio ad una data_fine che:
- non si ripetono.
- si ripetono in base al giorno xx(es ogni 1 del mese) per sempre
- si ripetono in base al giorno xx(es ogni 1 del mese) fino alla data xx.xx.xx
- si ripetono in base al giorno della settimana(es ongi lun o mart etcc.) per sempre
- si ripetono in base al giorno della settimana(es ongi lun o mart etcc.) fino alla data xx.xx.xx

Codice PHP:
(SELECT FROM `eventi
WHERE ripetibile '2' 
AND '2008-11-03'>=data_in 
AND '2008-11-03' <= data_fi)
 
UNION (SELECT FROM `eventi
        
WHERE ripetibile '1' 
        
AND '2008-11-03' <= data_fine_rip 
        
AND (
                (
                    
'2008-11-03' >= CONCAT('2008-11-',giorno_mese
                    AND 
'2008-11-03' <= ADDDATE(concat('2008-11-',giorno_mese),DATEDIFFdata_fidata_in )) 
                )
                OR(
                    
'2008-11-03' >= CONCAT('2008-10-',giorno_mese
                    AND 
'2008-11-03' <= ADDDATE(concat('2008-10-',giorno_mese),DATEDIFFdata_fidata_in ))
                )
            )
        )
UNION(SELECT FROM `eventi
        
WHERE ripetibile '1'  
        
AND (
                (
                    
'2008-11-03' >= CONCAT('2008-11-',giorno_mese
                    AND 
'2008-11-03' <= ADDDATE(concat('2008-11-',giorno_mese),DATEDIFFdata_fidata_in )) 
                )
                OR(
                    
'2008-11-03' >= CONCAT('2008-10-',giorno_mese
                    AND 
'2008-11-03' <= ADDDATE(concat('2008-10-',giorno_mese),DATEDIFFdata_fidata_in ))
                )
            )
        )
UNION(SELECT FROM eventi 
        WHERE ripetibile
='1'
        
AND    (
                (
                    
'2008-11-04' >= DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 7 DAY
                    AND 
                    
'2008-11-04' <= ADDDATE(DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 7 DAY),DATEDIFFdata_fidata_in ))
                )
                OR
                (
                    
'2008-11-04' >= DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 14 DAY)
                    AND 
                    
'2008-11-04' <= ADDDATE(DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 14 DAY),DATEDIFFdata_fidata_in ))
                )
            )
        )
UNION(SELECT FROM eventi 
        WHERE ripetibile
='1'
        
AND '2008-11-03' <= data_fine_rip 
        
AND    (
                (
                    
'2008-11-04' >= DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 7 DAY
                    AND 
                    
'2008-11-04' <= ADDDATE(DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 7 DAY),DATEDIFFdata_fidata_in ))
                )
                OR
                (
                    
'2008-11-04' >= DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 14 DAY)
                    AND 
                    
'2008-11-04' <= ADDDATE(DATE_SUB(STR_TO_DATE(CONCAT(CONCAT('2008',WEEKOFYEAR('2008-11-04 '),giorno_settimana)), '%X%V %W'), INTERVAL 14 DAY),DATEDIFFdata_fidata_in ))
                )
            )
        ) 
come vedete la query è davvero lunga e piena di ripetizioni che probabilmente sono inutili. sapreste aiutarmi ad ottimizzarla?
grazie in anticipo