문제

내 SQL 테이블은 (메시지, 생성)와 같습니다.

서로 x 초 안에있는 행을 선택하고 싶습니다. 마지막 메시지가 지금부터 x 초 이내에 있다고 가정하면 선택해야합니다. 두 번째 마지막 메시지가 마지막 메시지에서 x 초 이내에 있으면 선택해야합니다. 다시 말해 각 행은 다음 행과 비교하고 확인해야합니다. 마지막 행의 경우 Say Now ()로 확인해야합니다. 기본적으로 나는 마지막 메시지 세션을 원합니다 (즉, x 초 내에 consequtive 메시지가 서로 연결되어 있다고 가정 할 때 우리가 서로 연결 한 마지막 메시지 세트).

나는 이것을 위해 SQL 쿼리를 작성하는 방법을 모른다. 가능합니까?

시간 내 주셔서 대단히 감사합니다.

도움이 되었습니까?

해결책

이 스크립트는 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

다른 팁

나는 당신이 너무 복잡하다고 생각하고 있다고 생각합니다 (그러나 다시, 어쩌면 나는 요구 사항을 오해했을까요?)

이것은 특정 메시지 전에 30 초 이내에 생성 된 모든 메시지를 선택합니다.

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

여기서 17은 물론 관심있는 메시지 ID이고 30은 시간 프레임의 초 수입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top