我有一个聊天系统,我想显示过去一小时内发送的消息,但我也希望显示最近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;
答案 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篇帖子。如果过去一小时内有大量数据,您将获得所有这些数据。
答案 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个时,它应该只添加比过去一小时更早的帖子。