質問

私のSQLテーブルは(message、created)のようなものです

互いにX秒以内にある行を選択したい。最後のメッセージがNOW()からX秒以内にあるとしたら、それを選択する必要があります。最後から2番目のメッセージが最後のメッセージからX秒以内にある場合は、それも選択する必要があります。つまり、各行を次の行と比較してチェックする必要があります。最後の行については、NOW()で確認する必要があります。基本的に、メッセージの最後のセッション(つまり、X秒以内に結果として生じるメッセージが相互にリンクされていると仮定して、相互にリンクした最後のメッセージセット)が必要です

このための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