如何查找在特定时间范围内发生的条目?

时间:2017-01-08 04:27:53

标签: mysql

我有一个这样的表(这是样本数据):

 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被骗了,导致前两个条目是他在24小时的范围内玩了两次。他在午夜和凌晨1点演出。 玩家84没有作弊,他等了超过24小时才玩。 2016年12月19日,玩家42再次上场,但这次不是作弊,因为他最后一次有效的比赛是在24小时之前。

有没有办法纯粹在SQL中做到这一点?或者我应该提出PHP并迭代我的所有用户并且好...写一个糟糕的脚本? 谢谢!

1 个答案:

答案 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;
根据此时间与上次之间的差异是否小于24小时,

flag列设置为1。

该方法使用用户定义的变量来跟踪每个用户的最后time,然后找出此time和最后time之间的差异。请记住,order by子句对它起作用至关重要。

相关问题