Изменение строки «статус» в MySQL для разных временных интервалов в реальном времени - PullRequest
0 голосов
/ 24 февраля 2012

Я постараюсь объяснить проблему как можно подробнее, без объяснения самого приложения.

У меня есть таблица 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 </p>

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Кажется, что это может быть более подходящим образом обработано в запросе, который извлекает сообщения, а не в чем-то, что постоянно обновляет таблицу.

Вы можете либо вычислить статус в приложении после получения сообщений, либо вернутьвычисляемое поле состояния из самого запроса:

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'
0 голосов
/ 24 февраля 2012

Я бы предложил создать столбец отметки времени 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']));
}
...