PHP/MySQL を使用して、カレンダーで悪名高い繰り返しイベントを実行しようとしています。私はついにうまくいくと思われるものを見つけました。ここで答えを見つけましたが、仕上げるのに少し苦労しています。
私の最初のテーブル「イベント」。
ID NAME
1 Sample Event
2 Another Event
繰り返しデータを格納する 2 番目のテーブル '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があります。以下で使用されているタイムスタンプ (2012 年 5 月 12 日の 1299132000) は、時間のない現在の日付です。
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
EM1.'meta_value'
上記の MySQL では、次のコードは現在の日付からrepeat_start フィールド ( ) を差し引き、それを繰り返し間隔フィールド ( 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 (2012 年 17 月 17 日) に変更すると、次のようになります。
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