2017-01-08 10 views
0

私はこのようなテーブルを持っている(これはサンプルデータです):特定の時間帯に発生したエントリを見つける方法はありますか?

user (int) | credits (int) | time (timestamp as bigint) 
42   | 1000   | 1482015600 (18/12/2016 0:00:00) 
42   | 1000   | 1482019200 (18/12/2016 1:00:00) 
84   | 1000   | 1482022800 (18/12/2016 2:00:00) 
84   | 1000   | 1482120000 (19/12/2016 5:00:00) 
42   | 1000   | 1482130800 (19/12/2016 8:00:00) 

自分のサイト上の宝くじは問題を抱えていたし、一部のユーザーが複数回日をプレイすることができました(私はの理論的限界を持っています24時間ごとに1回再生)。 私はそこにあってはいけないすべてのエントリを探したい。

私の例では、ユーザー42が騙されていることがわかります。最初の2つのエントリが24時間の範囲で2回再生していることがわかります。彼は真夜中と午前1時に遊んだ。 Player 84は不正行為をしなかったが、彼は24時間以上プレイするのを待った。 20/19/12にプレイヤー42が再びプレイしましたが、今回はそれがカンニングではないため、最後の有効なプレイは24時間以上前です。

純粋にSQLで行う方法はありますか?または、PHPを立ち上げて、すべてのユーザーと繰り返し実行する必要があります...ひどいスクリプトを作成しますか? ありがとう!

+0

質問にサンプルデータを投稿してください – GurV

+0

時間の列にはどの値を保存していますか?それらがUNIXのタイムスタンプであれば、1人のユーザーの2つの時間の差分を24時間のタイムスタンプの差分と比較することができます –

+0

私はいくつかのサンプルデータを追加し、私の例を改訂しました。あなたのお時間をありがとう! –

答えて

0

これを試してください:

SELECT 
    user, credits, time 
FROM 
    (SELECT 
     t1.*, 
      CASE 
       WHEN @user = user THEN time - @time 
       ELSE 0 
      END < 24 * 60 * 60 flag, 
      @user:=user, 
      @time:=time 
    FROM 
     (SELECT 
     * 
    FROM 
     your_table 
    ORDER BY user , time) t1 
    CROSS JOIN (SELECT @user:=- 1, @time:=- 1) t2) t 
WHERE 
    flag = 1; 
flag

列が今回と前回との差が24時間未満であったかどうかをベース1に設定されています。

この方法では、ユーザー定義の変数を使用して各ユーザーの最後のtimeを追跡し、このtimeと最後のtimeの間の差異を検出します。 order by句は、動作するために非常に重要であることを覚えておいてください。

+0

あなた、私の日を救った。これは完全に機能するようです。 あなたはあなたのやり方を私に説明してもらえますか? 私はすべてをチェックし終わったときに私の質問を "解決"しますが、あなたに大きな感謝をします。 –

+0

@ nsierra-質問にいくつかの説明が追加されました。 – GurV

関連する問題