我有一个这样的表(这是样本数据):
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并迭代我的所有用户并且好...写一个糟糕的脚本? 谢谢!
答案 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
子句对它起作用至关重要。