我想在我的網站上實現一個類似於stackoverflow上的保真度程序。PHP/MySQL - 保真度程序實現
我希望能夠爲連續30天訪問過我的網站的用戶提供某種獎勵。
[MySQL]什麼是最好的表架構?
[PHP]我應該使用什麼樣的算法來優化此任務?
我想在我的網站上實現一個類似於stackoverflow上的保真度程序。PHP/MySQL - 保真度程序實現
我希望能夠爲連續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上工作),所以如果語法稍微偏離了一點,我很抱歉。不過,我希望這個概念有意義。
從上面的描述可以很簡單地完成這個任務,並且只需一張表。
這就是它的表。 :)
的算法是三個部分: 當用戶登錄時,一旦被驗證......
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。