我的sql表类似于(message,created)
我想选择彼此相距X秒的那些行。假设最后一条消息在NOW()的X秒内,然后它应该选择它。如果倒数第二条消息在距离最后一条消息的X秒内,那么它也应该选择它。换句话说,每行应与下一行进行比较并进行检查。对于最后一行,应该用NOW()来检查。基本上我想要最后一段消息(即我们彼此链接的最后一组消息,假设X秒内的连续消息彼此链接)
我不知道如何为此编写SQL查询。它甚至可能吗?
非常感谢你的时间。
答案 0 :(得分:6)
此脚本适用于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
答案 1 :(得分: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是您的时间范围内的秒数。