2017-01-08 31 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小时播放一次)。 我想找到不应该在那里的每个条目。

在我的例子中,我们可以看到用户42被骗,导致前两个条目是他在24小时的范围内玩两次。他在午夜和凌晨1点演奏。 玩家84没有作弊,他等了超过24小时才玩。 2016年12月19日,第42位球员再次出场,但这次不是一个骗子,因为他最后一次有效的比赛是在24小时前。

有没有办法在SQL中完成它?或者我应该调出PHP并迭代所有用户,并且写出一个糟糕的脚本? 谢谢!

+0

请在问题中发布一些示例数据 – GurV

+0

您在时间栏中存储什么值?如果他们是unix时间戳,则可以比较单个用户的两次差异与timestamp差异等于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

相关问题