如果过去一小时内没有,请记录过去一小时或最后20个项目的记录

时间:2017-04-25 23:52:23

标签: php mysql node.js

我有一个聊天系统,我想显示过去一小时内发送的消息,但我也希望显示最近20条消息,无论它们发送多长时间。

有没有办法可以在SQL查询中执行此操作?

CREATE TABLE IF NOT EXISTS `chat` (
  `id`        INT(11) UNSIGNED                                                                            NOT NULL AUTO_INCREMENT,
  `user_id`   INT(11) UNSIGNED                                                                            NOT NULL,
  `item_id`   INT(11) UNSIGNED                                                                            NOT NULL,
  `message`   TEXT                                                                                        NOT NULL,
  `recipient` INT(11)                                                                                     NOT NULL DEFAULT '0',
  `type`      ENUM ('message', 'announcement') NOT NULL DEFAULT 'message',
  `channel`   ENUM ('general', 'private')                                              NOT NULL DEFAULT 'general',
  `posted`    DATETIME                                                                                    NOT NULL,
  PRIMARY KEY (`id`),
  KEY `user_id` (`user_id`),
  KEY `posted` (`posted`),
  KEY `type` (`type`),
  KEY `channel` (`channel`),
  KEY `recipient` (`recipient`)
)
  ENGINE = MyISAM
  DEFAULT CHARSET = `utf8`
  AUTO_INCREMENT = 2;

2 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

(
    select * from chat
    where timestamp > DATE_SUB(now(), interval 1 hour)
)
union
(   
    select * from chat order by posted desc limit 20
)
order by posted

说明:

  • 选择过去一小时内的所有讯息。
  • 它还选择最后20条消息,作为单独的查询(20条记录很快)
  • 联合合并两个结果,并在两个
  • 之间重叠的情况下删除双打

因此,如果过去一小时内没有数据,您仍会收到最近的20篇帖子。如果过去一小时内有大量数据,您将获得所有这些数据。

答案 1 :(得分:1)

试试这个:

SELECT *
FROM `chat`
ORDER BY `posted` DESC
LIMIT 0,20;

它将列出最后20行(按日期/时间)。由于你想在过去一小时内没有足够的聊天记录,你不必担心聊天的年龄。

以下是未经测试的,可能有语法错误,因此您可能需要稍微玩一下。

SELECT *
FROM `chat`
WHERE DATE_ADD(a.`posted` interval 1 hour) <= NOW()
UNION
(
    SELECT *
    FROM `chat`
    WHERE a.posted > DATE_SUB(NOW(), interval 1 hour)
    AND (SELECT count(*) FROM `chat` WHERE a.posted <= DATE_SUB(NOW(), interval 1 hour)) < 20
    ORDER BY `posted` DESC
    LIMIT 0,20)
ORDER BY `posted` DESC

在过去一小时内,当帖子少于20个时,它应该只添加比过去一小时更早的帖子。