3

条件が一致したときに、一定の時間間隔の後にテーブルを更新するにはどうすればよいですか?

tb_コンテスト
ID コンテスト ID 名前 is_expire
1 101 新しい 0
2 102 古い 0

tb_answer
コンテスト_ID 回答_ID 日付
101 1 2012-02-02
101 2 2012-09-14
102 5 2012-06-01

tb_contestいくつかの条件が満たされた後に更新する必要がありis_expire=1、受信した最後の回答に基づいて2日後に作成する必要がある2012-03-14ため、tb_contestに更新する必要があります2012-09-16

4

3 に答える 3

6

MySQLのイベントスケジューラを使用できます:

CREATE EVENT expire_contests
  ON SCHEDULE EVERY DAY
     STARTS CURRENT_DATE
  DO UPDATE tb_contest JOIN (
       SELECT   contest_id, MAX(date) AS latest
       FROM     tb_answer
       GROUP BY contest_id
     ) t USING (contest_id)
     SET    tb_contest.is_expire = 1
     WHERE  tb_contest.is_expire <> 1
        AND t.latest <= CURRENT_DATE - INTERVAL 2 DAY
于 2012-09-14T09:42:29.183 に答える
2

これを試して、

UPDATE tb_contest a INNER JOIN
        (
            SELECT contest_ID, MAX(`date`) maxDate
            FROM tb_answer
            GROUP BY contest_ID
        ) b ON a.contest_ID = b.contest_ID
SET a.is_expire = 1
WHERE   DATEDIFF(CURDATE(), b.maxDate) >= 2 AND 
        a.is_expire = 0

つまり、2 つのテーブルは によって結合されcontest_ID、最新の回答日はtb_answerです。を使用DATEDIFF()することで、今日の日付とコンテストに回答された日付の違いを知ることができます。

于 2012-09-14T09:41:08.277 に答える
0

JOIN句の回答テーブルでコンテストと内部クエリを実行し、MySQLUPDATEを使用しDATEDIFFて、回答が回答されてからの日数をカウントできます。

UPDATE
    tb_contest c
    JOIN (SELECT contest_id, MAX(date) AS date FROM tb_answer GROUP BY contest_id) AS a
        ON a.contest_id = c.id
SET
    c.is_expire = 1

WHERE 
    DATEDIFF(NOW(), a.date) >= 2
于 2012-09-14T09:46:06.700 に答える