在MySQL中以不同的时间间隔实时更改行“状态”

时间:2012-02-24 00:44:21

标签: mysql time real-time

我将尝试尽可能详细地解释问题,而不解释应用程序本身。

我有一个MySQL表,记录发送消息的时间,以及是否已读取或未读取消息。 现在我需要在此表中创建一个列,根据未读的时间间隔为消息提供状态。

For example, if message was unread for:
1h - it gets status of "1";
1day - status of "2";
2days - status of "3";
3days - status of "4";
7days and more - status of "5".

因此,假设我有一条13:20发送的消息并且未读,它的状态为“NULL”。我需要它在14:20的状态为“1”,在13:20的第二天状态为“2”。

现在我可以想到几个选项,但它们每分钟都会涉及Crone工作,和/或大量的计算。我的网站发展迅速,我希望找到最佳和可扩展的选项。也许有一些内部MySQL选项,比如触发器或其他东西。

感谢任何帮助< 3

2 个答案:

答案 0 :(得分:1)

在查询中检索消息而不是连续更新表的内容似乎可以更恰当地处理这个问题。

您可以在检索邮件后计算应用程序中的状态,或从查询本身返回计算状态字段:

SELECT
  user,
  from,
  subject,
  time,
  created,
  read,
  IF(NOW() - INTERVAL 7 DAY > created, 5,
    IF(NOW() - INTERVAL 3 DAY > created, 4,
      IF(NOW() - INTERVAL 2 DAY > created, 3
        IF(NOW() - INTERVAL 1 DAY > created, 2
          IF(NOW() - INTERVAL 1 HOUR > created, 1
            0
          )
        )
      )
    )
  )
FROM messages
WHERE user = 'foo'

答案 1 :(得分:0)

我建议创建一个created_at时间戳列作为消息架构的一部分,这样可以运行类似于以下的查询:

 select *, datediff(now(), created_at) as date_diff from your_table;

然后,当您准备演示数据时,您可以执行类似(仅限演示)的操作:

class Message
{
    public static function convertToStatusCode($diff)
    {
        switch ($diff) {

            case 0:
                return 1;

            case 1:
                return 2;

            case 2:
                return 3;

            case 3:
                return 4;

            default: 
                return 5;
        }
    }
}

// Construct and execute your query
while ($row = $dbo->fetch()) {

     // Add status while hydrating
     $message = new Message();

     $message->setStatus(Message:convertToStatusCode($row['date_diff']));
}