Повторение событий календаря и некоторых окончательных математических вычислений

Я пытаюсь пойти на печально известные повторяющиеся события в календаре, используя PHP/MySQL. Наконец-то я нашел что-то похожее на работу. Я нашел ответ здесь, но мне сложно с этим справиться.

Мои первые "события" таблицы.

ID    NAME
1     Sample Event
2     Another Event

Моя вторая таблица 'events_meta, которая хранит повторяющиеся данные.

ID    event_id      meta_key           meta_value
1     1             repeat_start       1336312800 /* May 7th 2012 */
2     1             repeat_interval_1  432000 /* 5 days */

С repeat_start будет дата без времени как временная отметка unix, а repeat_interval - количество секунд между интервалами (432000 - 5 дней).

Затем я имею следующий MySQL, который немного изменил из приведенной выше ссылки. Временная метка, используемая ниже (1299132000, которая составляет 12 мая 2012 года), является текущим днем ​​без времени.

SELECT EV.*
FROM `events` EV
RIGHT JOIN `events_meta` EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN `events_meta` EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` )
WHERE EM1.meta_key = 'repeat_start'
    AND (
        ( CASE ( 1336744800 - EM1.`meta_value` )
            WHEN 0
              THEN 1
            ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`
          END
        )
    ) = 1

В приведенном выше MySQL следующий код вычитает поле repeat_start (EM1.'meta_value') с текущей даты и затем делит его на поле интервала повтора (EM2.'meta_value').

ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`

ИЛИ

TODAYS DATE - START DATE / 5 DAYS

Итак, вот математика:

1336744800 - 1336312800 = 432000
432000 / 432000 = 1

Теперь это работает отлично. Но если я изменю текущую временную метку на 5 дней вперед до 1336312800, которая является 17-м матчем 2012 года, это выглядит примерно так:

1336312800 - 1336312800 = 864000
86400 / 432000 = 2

Что не работает, потому что он равен 2, а в MySQL ему нужно равняться 1. Так что, я думаю, мой вопрос в том, как заставить MySQL распознавать целое число, а не делать это?

...
WHERE EM1.meta_key = 'repeat_start'
    AND (
        ( CASE ( 1336744800 - EM1.`meta_value` )
            WHEN 0
              THEN 1
            ELSE ( 1336744800 - EM1.`meta_value` ) / EM2.`meta_value`
          END
        )
    ) = IN (1,2,3,4,5,6,7,8,....)

Надеюсь, что у меня есть смысл, и я надеюсь, что это просто простая математика или функция, которую MySQL может помочь:) Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ: ОТВЕТ

Благодаря @eggypal ниже, я нашел свой ответ, и, конечно, это было просто!

SELECT EV.*
FROM elvanto_calendars_events AS EV
RIGHT JOIN elvanto_calendars_events_meta AS EM1 ON EM1.`event_id` = EV.`id`
RIGHT JOIN elvanto_calendars_events_meta AS EM2 ON EM2.`meta_key` = CONCAT( 'repeat_interval_', EM1.`id` )
WHERE EM1.meta_key = 'repeat_start'
AND ( ( 1336744800 - EM1.`meta_value` ) % EM2.`meta_value`) = 0

Ответ 1

Не совсем понятно, что вы хотите, чтобы ваш запрос выполнялся, но сумасшедший вопрос вашего вопроса заставляет меня наклониться к предложению, что вы смотрите на модульную арифметику: в SQL a % b возвращает остаток, когда a делится на b - если нет остатка (т.е. a % b = 0), то a должно быть точным кратным b.

В вашем случае, я думаю, вы пытаетесь найти события, где время между началом события и некоторым заданным литералом является точным кратным интервалу событий, то есть (literal - event_start) % event_interval = 0. Если это отличное от нуля значение - это время следующего появления после literal (и, следовательно, чтобы определить, произойдет ли это следующее возникновение в течение некоторого периода времени, например, в течение дня, можно было бы проверить, остается ли остаток меньше такой постоянной, например (literal - event_start) % event_interval < 86400).

Если это не то, что вам нужно, проясните, что именно пытается выполнить ваш запрос.