请帮助我:
场景: 构建一个系统(Backend:Mysql,scripting lang:Javascript / PHP) 用户执行某些操作以获得某些点的位置。让我们说1动作= 1分。
我的问题:现在我想限制用户每天获得最多5分。 24小时间隔之间的平均值用户可以执行任意次数的操作,但点数增量将在达到“5”后达到顶部
请建议我这样做的有效方法。我的数据库很简约,只有用户详细信息,分数。
现在我需要添加一个时间戳列。没问题,但问题是如何选择更新时间和时间。非常困惑:(
答案 0 :(得分:1)
您可以实现此目标的方法之一是跟踪总分数,给定日期中的分数以及最后一次更新的时间戳。然后你的逻辑看起来像这样:
if the action is performed, which may cause a point award
if last_point_timestamp < today then
increment total points
set today's points to 1
set last_point_timestamp to current date/time
elseif today's points below 5
increment total points
increment today's points
set last_point_timestamp to current date/time
else
maximum number of points for today is reached - no more points
end if
end if
基本上,它在任何日历日都不会超过5分。如果要在多个时区使用您的系统,您需要小心,因为在这种情况下,“今天”对不同的人来说意味着不同的事情。例如,它可能是伦敦的星期二凌晨2点(即更改的那天),但它仍然是旧金山的星期一下午6点(即当天没有变化)
答案 1 :(得分:0)
我不知道这是否是最有效的方式,但您可以在数据库中为每个用户创建一个字段,以跟踪他们当天获得的积分数。因此,当他们在你的例子中达到5分时,他们就不再获得了。
然后,您可以拥有一个cron作业或其他东西,在指定的时间将所有用户重置为0,例如午夜。
答案 2 :(得分:0)
有一个名为Points的表,有四个字段: 用户 点 todays_points last_point
添加一个点:
SELECT * FROM points WHERE 'user' == $user"
if(last_point < older than today)
resetPoints($user);
addPoint($user);
elseif(todays_points < 5)
addPoint($user)
function resetPoints($user)
UPDATE todays_points to zero;
function addPoint($user)
ADD one to total points
ADD one to todays points
UPDATE last_point to current times
答案 3 :(得分:0)
我个人会这样做与MysticXG类似,但触发跟踪限制。我之所以使用cron作业,是因为它集中了点的重置并确保它不会给数据库带来负担,只需每天执行“UPDATE users SET limit = 5”就可以轻松完成。在本例中,我创建了一个包含字段
的表user INT UNSIGNED AI PK
points INT UNSIGNED
dailyLimit TINYINT UNSIGNED DEFAULT 5
然后我在使用以下逻辑
更新之前添加了触发器IF NEW.points > OLD.points THEN
IF NEW.points - OLD.points > OLD.dailyLimit THEN
SET NEW.points = OLD.points + OLD.dailyLimit;
END IF;
SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points;
END IF
这意味着如果用户点数增加,它将增加到当天剩余的点数。如果他们超过了这个限制,它会增加他们剩余的点数。如果他们的分数减少,那么他们的限制不受影响(不确定这是否可取)
然后要重置限制,您所要做的就是每天在设定点运行执行此查询的脚本
UPDATE users SET dailyLimit = 5
仅供参考,这是创建触发器的完整查询
CREATE TRIGGER `checkLimit` BEFORE UPDATE ON `points` FOR EACH ROW
IF NEW.points > OLD.points THEN
IF NEW.points - OLD.points > OLD.dailyLimit THEN
SET NEW.points = OLD.points + OLD.dailyLimit;
END IF;
SET NEW.dailyLimit = OLD.dailyLimit + OLD.points - NEW.points;
END IF;