我想在我的网站上实现一个类似于stackoverflow的保真程序。
我希望能够为连续30天访问我网站的用户提供某种奖励。
[MySQL]什么是最好的表架构?
[PHP]我应该使用哪种算法来优化此任务?
答案 0 :(得分:0)
从上面的描述中,这可以通过一个表格相当简单地完成。
这就是桌子。 :)
算法分为三个部分: 当用户登录后,一旦他们被验证......
1)检查用户LAST_CONSECUTIVE_DAY。如果今天是LAST_CONSECUTIVE_DAY,则不执行任何操作。如果LAST_CONSECUTIVE_DAY是昨天,请将LAST_CONSECUTIVE_DAY设置为今天的日期。否则,请将FIRST_CONSECUTIVE_DAY和LAST_CONSECUTIVE_DAY设置为今天的日期。
2)使用TIMESTAMPDIFF比较DAY单位的LAST_CONSECUTIVE_DAY和FIRST_CONSECUTIVE_DAY。如果它返回30继续执行步骤3,否则继续使用该应用程序。
3)您的用户连续30天每天都访问过该网站!恭喜!检查HAS_BEEN_REWARDED以查看他们之前是否已完成此操作,如果仍为false则为他们提供奖品并将HAS_BEEN_REWARDED标记为true。
答案 1 :(得分:0)
我更喜欢数据库中的原始数据,而不是@Matt H.提倡的方法。制作一个表格,记录网站的所有登录(或者,如果您愿意,还可以记录新的会话启动)及其时间和日期:
CREATE TABLE LoginLog (
UserId INT NOT NULL REFERENCES Users (UserId),
LoginTime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
)
CREATE INDEX IX_LoginLog USING BTREE ON LoginLog (UserId ASC, LoginTime DESC)
只需在登录时将UserId插入表中即可。当然,我对您的数据库做了一些假设,但我认为您将能够适应。
然后,检查前三十天的每一天的离散登录:
SELECT COUNT(*)
FROM (SELECT DATE(log.LoginTime) AS LoginDate,
COUNT(*) AS LoginCount
FROM LoginLog log
WHERE log.LoginTime >= DATE(DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 30 DAYS))
GROUP BY LoginDate
HAVING COUNT(*) > 0) a
如果结果是30,那你就是黄金。
我承认我有一段时间没有触及过MySQL(最近主要在SQL Server和PostgreSQL上工作),所以如果语法稍微偏离,我道歉。但我希望这个概念有意义。