7

我的 sql 表类似于 (message,created)

我想选择彼此相距 X 秒内的那些行。假设最后一条消息在 NOW() 的 X 秒内,那么它应该选择它。如果倒数第二条消息在最后一条消息的 X 秒内,那么它也应该选择它。换句话说,每一行都应该与下一行进行比较并检查。对于最后一行,应使用 NOW() 进行检查。基本上我想要最后一个消息会话(即我们相互链接的最后一组消息,假设 X 秒内的后续消息相互链接)

我不知道如何为此编写 SQL 查询。甚至可能吗?

非常感谢您的宝贵时间。

4

2 回答 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
于 2009-05-08T09:49:17.530 回答
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 是您的时间范围内的秒数。

于 2009-05-08T09:49:27.750 回答