2012-05-11 6 views
12

PHP/MySQLを使用して、悪名高い反復イベントのカレンダーに出ようとしています。私は最終的にはうまくいくものを見つけました。私はanswer hereを見つけましたが、少し難しかったです。カレンダーのイベントといくつかの最終的な計算を繰り返す

私の最初のテーブル 'events'。

私の2番目のテーブル 'events_metaは、繰り返しデータを格納します。 REPEAT_STARTはUnixタイムスタンプのような時間がないと日付された状態で

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

、及び間隔間の秒の量をREPEAT_INTERVAL(432000は5日です)。

私は上記のリンクから少し変更した以下のMySQLを持っています。下記のタイムスタンプ(2012年5月12日の1299132000)は、時間のない現在の日付です。上記MySQLでは

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 

、次のコードは、現在の日付からREPEAT_STARTフィールド(EM1.'meta_value')を控除した後、リピート間隔フィールド(EM2.'meta_value')で除算。

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

OR

TODAYS DATE - START DATE/5 DAYS 

ので、ここで数学です:完璧な作品

1336744800 - 1336312800 = 432000 
432000/432000 = 1 

今は。私は17日マット2012で1336312800に5日後に控え、現在のタイムスタンプを変更した場合でも、それが見えます。このようなビット:

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があなたの助け:)それが役立つ感謝を持っている機能ですね!

EDIT:ANSWER以下@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

タイムスタンプと1日の固定秒数に基づく日付の計算は、夏時間に影響します。 – DCoder

+1

良いコール@DCoder。私はすべての時間をGMTとして保存し、次にCONVERT_TZ関数を使用して 'repeat_start'日付を決定します。上記のコード例にはこの余分なコードは含まれていません。私はそのトリックを正しく行うべきだと思いますか? –

+0

あなたのお問い合わせで、指定された開始日と終了日の結果が表示されますか? '1336744800'は特定の日のようです:( –

答えて

10

それはあなたがへのクエリがを行いたいか完全には明らかではないですが、あなたの質問のJISTは、私はあなたがモジュラー算術に見えることを示唆している方に傾く可能:a余りを返しa % b SQLにbで除算されます。余り(つまり、a % b = 0)がない場合、aは、正確な倍数,bでなければなりません。あなたのケースでは

、私はあなたがイベント間の時間が開始イベントを検索しようとしているといくつかのリテラル与え考えるイベント間隔の倍数である:それは、(literal - event_start) % event_interval = 0です。ゼロ以外の値であれば、値はliteralの後の次の出現までの時間です(したがって、次の出現がある期間、たとえば1日に発生するかどうかを判断するには、残量がそのような定数、例えば(literal - event_start) % event_interval < 86400)。

これがあなたの後ろでない場合は、クエリが達成しようとしていることを明確にしてください。

+0

これはトリックです!私はそれをPHPで動作させることができました: 'echo((strtotime( '2012-05-22 00:00:00') - 1336312800)%432000);' MySQLで '%'を使ってみましたが、うまくいかなかったのですが、同等ですか? –

+0

残念です私の最後のコメントを無視して、それは働いた!私は他の人を助けるために最終的なコードで私の元の投稿を編集する:) –

+0

私はそれに続いて失敗した。助けて。 http://stackoverflow.com/questions/20286332/display-next-event-date – Billa

関連する問題