2011-02-08 50 views
3

我想在我的網站上實現一個類似於stackoverflow上的保真度程序。PHP/MySQL - 保真度程序實現

我希望能夠爲連續30天訪問過我的網站的用戶提供某種獎勵。

[MySQL]什麼是最好的表架構?

[PHP]我應該使用什麼樣的算法來優化此任務?

回答

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) 

只需插入用戶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上工作),所以如果語法稍微偏離了一點,我很抱歉。不過,我希望這個概念有意義。

0

從上面的描述可以很簡單地完成這個任務,並且只需一張表。

  • | ID |表PK,自動遞增
  • | EMAIL |網站訪問者的唯一ID。表面上是一封電子郵件,但可能是唯一ID的訪問者的任何一段數據
  • | FIRST_CONSECUTIVE_DAY |時間戳
  • | LAST_CONSECUTIVE_DAY |時間戳
  • | HAS_BEEN_REWARDED |布爾,默認爲假(0)

這就是它的表。 :)

的算法是三個部分: 當用戶登錄時,一旦被驗證......

1)檢查用戶LAST_CONSECUTIVE_DAY。如果LAST_CONSECUTIVE_DAY是今天,則什麼也不做。如果LAST_CONSECUTIVE_DAY是昨天,請將LAST_CONSECUTIVE_DAY設置爲今天的日期。否則,請將FIRST_CONSECUTIVE_DAY和LAST_CONSECUTIVE_DAY設置爲今天的日期。

2)使用TIMESTAMPDIFF比較LAST_CONSECUTIVE_DAY和FIRST_CONSECUTIVE_DAY的DAY單位。如果它返回30,繼續執行第3步,否則繼續執行應用程序。

3)您的用戶每天連續訪問該網站30天!恭喜!檢查HAS_BEEN_REWARDED以查看它們是否已經完成,如果還是錯誤,則給予它們獎勵並將HAS_BEEN_REWARDED標記爲true。