3

当条件匹配时,如何在一段时间间隔后更新表?

tb_contest
id 竞赛_id 名称 is_expire
1 101 新 0
2 102 旧 0

tb_answer
比赛编号 answer_id 日期
101 1 2012-02-02
101 2 2012-09-14
102 5 2012-06-01

我需要tb_contest在满足某些条件后更新,并is_expire=1在 2 天后根据收到的最后一个答案 i:e进行更新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

就这样,这两个表被连接起来,contest_ID并在 上具有最新的回答日期tb_answer。通过使用DATEDIFF()我们可以知道今天的日期和比赛被回答的日期之间的差异。

于 2012-09-14T09:41:08.277 回答
0

您可以在子句JOIN中的答案表上进行竞赛和内部查询,并使用 MySQL来计算答案被回答后的天数:UPDATEDATEDIFF

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 回答