选择在X秒范围内的Sql日期行

7
我的 MySQL 表格看起来像这样 (message,created)。
我想选取那些在 X 秒内的行。比如最后一条留言距离 NOW() 在 X 秒以内,那么就应该选择它。如果倒数第二条留言距离最后一条留言在 X 秒以内,那么它也应该被选择。换句话说,每一行都应该与下一行进行比较和检查。对于最后一行,应该用 NOW() 进行检查。基本上,我想要最后一次会话中的留言(即我们链接到彼此的最后一组留言,假设在 X 秒内连续的留言是相互关联的)。
我不知道怎样编写 SQL 查询。这种查询是否可能?
非常感谢您的时间。
2个回答

8

这个脚本适用于SQLServer,您应该能够取出select语句并在MySQL中运行它。

DECLARE @Messages TABLE (Message VARCHAR(10), Created DATETIME)
DECLARE @Interval FLOAT

-- Interval is 1 day.
SET @Interval = 1

-- These should be in result
INSERT INTO @Messages VALUES ('Message1', GetDate())    
INSERT INTO @Messages VALUES ('Message2', GetDate()-1)
-- These should not be in result
INSERT INTO @Messages VALUES ('Message3', GetDate()-3)
INSERT INTO @Messages VALUES ('Message4', GetDate()-5)

SELECT m1.Message, m1.Created
FROM @Messages m1
     INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                AND m2.Created >= m1.Created
                                AND m2.Message <> m1.Message
UNION ALL SELECT m2.Message, m2.Created
FROM @Messages m1
     INNER JOIN @Messages m2 ON m2.Created <= m1.Created + @Interval                                
                                AND m2.Created >= m1.Created
                                AND m2.Message <> m1.Message
ORDER BY Created

你能给我解释一下吗?每个连接的部分具体是做什么的? - Alec Smart
1
@Alec Smart,不用谢。很高兴你解决了问题,我之前一直在“尝试”解释连接操作,但是由于英语不是我的母语,有些困难。 - Lieven Keersmaekers
这在postgresql中基本上也可以工作,只需要进行一些语法调整。 - sjakubowski

0

我认为你想得太复杂了(但也许我误解了需求?)

这将选择在特定消息之前30秒内创建的所有消息:

SELECT
  Id,
  MessageText,
  MessageDate
FROM
  Message
WHERE
  TIME_TO_SEC(TIMEDIFF(
    (
      SELECT MessageDate 
      FROM   Message
      WHERE  Id = 17
    ),
    MessageDate
  )) <= 30

这里的17当然是你感兴趣的消息ID,30则是你时间框架内的秒数。


请将以下与编程有关的内容从英语翻译成中文。只返回已翻译的文本:需要在每个信息之间保持30秒...不是针对单个信息。 - Alec Smart
你如何设想结果?"SELECT * FROM Messages WHERE {它们相隔30秒}"会是什么样子? - Tomalak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接