13

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
4

1 に答える 1

10

クエリで何をしたいのか完全に明確ではありませんが、質問の主旨から、モジュラー算術を検討することを提案する方向に傾いています。SQLでは、を で割ると剰余a % b返します。 thenは の正確な倍数でなければなりません。aba % b = 0ab

あなたの場合、イベントの開始から特定のリテラルまでの時間がイベント間隔の正確な倍数であるイベントを見つけようとしていると 思い(literal - event_start) % event_interval = 0ます。ゼロ以外の場合、値は次の発生までの時間literalです (したがって、次の発生が一定期間内 (たとえば 1 日) 内に発生するかどうかを判断するには、残りがそのような時間よりも少ないかどうかをテストします)一定例(literal - event_start) % event_interval < 86400)。

これが目的でない場合は、クエリが何を達成しようとしているのかを正確に明確にしてください。

于 2012-05-11T11:05:22.310 に答える