У меня есть две таблицы ...
tblEvent
--------
id
date
tblEventRecurring
-----------------
event_id
date_part
end_date
Отношение в том, что я могу иметь событие, которое происходит либо в один день (дата в tblEvent), либо повторяется с интервалом (день, неделя, месяц,Year), который связывается в таблице tblEventRecurring.
Например, если я добавлю событие, повторяющееся до 10 февраля, до 28 февраля, у меня будет ...
tblEvent
--------
id = 1
date = 2012-02-10
tblEventRecurring
-----------------
event_id = 1
date_part = D
end_date = 2012-02-28
чтоэто лучший способ структурировать запрос, чтобы получить все даты, когда выполняются следующие условия ...
- tblEvent.date = today
- , если tblEventRecurring.date_part = D и today
- , если tblEventRecurring.date_part = W и сегодня тот же день недели (вс-сБ), что и tblEvent.date и
- , если tblEventRecurring.date_part = M и сегодня тот же деньмесяца как tblEvent.date и
Существует ли одно решение более эффективное, чем другое?Это хорошее время для использования IF или CASE или набора операторов AND / OR?
Спасибо за любые рекомендации.D.
Поскольку за меня проголосовали за то, что я не исследовал, я решил опубликовать свой последний запрос ... Я боролся с некоторыми из И / ИЛИ и скобками.Я сделал исследование и читал больше на CASE, который я никогда не использовал, поэтому я надеялся, что кто-то может направить мой запрос, используя его.
# where the current date is 2012-02-12
SELECT e.record_id, e.event_date,
DATE_FORMAT(e.event_time, '%l:%i %p') AS event_time,
e.category, pm.person_id, pm.status, pm.active
FROM tblEvent e
JOIN tblTABLE pmd ON pmd.record_id = e.reference_id
JOIN tblTABLE2 pm ON pm.record_id = pmd.t_id
LEFT OUTER JOIN tblEventRecurring er ON er.event_id = e.record_id
WHERE e.category = 'CAT'
AND pm.planet_id = 1 # id of person
AND pm.active = 1
AND pm.status = 'Read Only'
AND (
e.event_date = '2012-02-12' # the event is on current date
OR (
# recurring with no end date or end date in future
er.end_date = '0000-00-00' OR er.end_date >= '2012-02-12'
AND (
e.event_date <= '2012-02-12' # recurring starts today or in past
AND ( # meets any of the following
(er.date_part = 'D')
OR (er.date_part = 'W' AND dayofweek('2012-02-12') = dayofweek(e.event_date))
OR (er.date_part = 'M' AND dayofmonth('2012-02-12') = dayofmonth(e.event_date))
OR (er.date_part = 'Y' AND (day('2012-02-12') = day(e.event_date) AND MONTH('2012-02-12') = MONTH(e.event_date)))
)
)
)
)
ORDER BY e.event_time