PHP / MySQL - Fidelity程序实现

时间:2011-02-08 14:52:24

标签: php mysql algorithm web debian

我想在我的网站上实现一个类似于stackoverflow的保真程序。

我希望能够为连续30天访问我网站的用户提供某种奖励。

[MySQL]什么是最好的表架构?

[PHP]我应该使用哪种算法来优化此任务?

2 个答案:

答案 0 :(得分:0)

从上面的描述中,这可以通过一个表格相当简单地完成。

  • | ID |表PK,自动递增
  • |电子邮件|网站访客唯一ID。表面上是一封电子邮件,但可以是唯一ID为访问者的任何数据
  • | FIRST_CONSECUTIVE_DAY |时间戳
  • | LAST_CONSECUTIVE_DAY |时间戳
  • | HAS_BEEN_REWARDED | bool,默认为false(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上工作),所以如果语法稍微偏离,我道歉。但我希望这个概念有意义。

相关问题