我想在我的网站上实现一个类似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上工作),所以如果语法有点问题,我很抱歉。不过,我希望这个概念有意义。

10-04 13:49