我想在我的网站上实现一个类似stackoverflow的fidelity程序。
我希望能够给连续30天访问我网站的用户一些奖励。
[mysql]什么是最好的表架构?
[php]我应该使用什么样的算法来优化这个任务?
最佳答案
我更喜欢数据库中的原始数据,而不是@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)
登录时只需将用户id插入表中。当然,我对你的数据库做了一些假设,但我认为你能适应。
然后,检查前30天的每个离散登录:
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上工作),所以如果语法有点问题,我很抱歉。不过,我希望这个概念有意义。