根据时间保持用户指标的计数

时间:2013-08-05 21:07:16

标签: database

我想在基于社区的网站上为用户保留一些成就。 我们的想法是连续5天记录成本,或者每个周末记录一个月。

我也会为获得100个帖子取得成就,但这很容易确定。我刚才给出的基于时间的例子有点困难。

如何制作某种通用系统来统计每个用户的这些指标?或者我最终会得到一个包含" every_weekend_for_month"等字段的大表格。和" 5_days_in_a_row"一旦这些整数达到4和5,它们就已经实现了#39;但是,对于这两个领域,我也必须保持上周末/天的得分。

2 个答案:

答案 0 :(得分:1)

您需要跟踪获得成就所需的所有数据(甚至部分数据)。

对于登录的成就,您需要每天跟踪一次登录,其中包含以下表格:

user_id | login

1 | 2013-07-20
1 | 2013-07-19
1 | 2013-07-16
2 | 2013-07-20
...

每当触发跟踪事件时,您还会检查成就。

event onLogin {

    // get the last 4 logins before the current login
    statement = (
        SELECT login FROM tracking_user_login
        WHERE user_id = 1
        ORDER BY login DESC
        LIMIT 1,4
    );
    statement.execute();

    // did the user even login at least 4 times already?
    if (statement.rowCount == 4) {

        date lastLogin = todaysLogin;
        int consecutiveLogins = 1;

        // iterate descending through the last days
        foreach (row in statement) {

            if (row.login == (lastLogin - 1day)) {
                consecutiveLogins++; // increment consecution
                lastLogin = (lastLogin - 1day); // prepare next comparison
            } else {
                // consecution interrupted, ignore the rest
                break;
            }
        }

        // enough to achieve something?
        if (consecutiveLogins >= 5) {
            user.addAchievement('5 CONSECUTIVE LOGINS');
        }
    }

}

您基本上可以在此活动中添加所有围绕登录的成就。

答案 1 :(得分:1)

您可以跟踪所有登录并使用该数据来推断成就。跟踪和搜索单个登录可能会更慢。如果您拥有非常大的用户群和大量登录,那么在登录时进行这些计数可能并非易事。

如果你想加快速度,你可以追踪特定成就的最后登录日期,然后增加一个听起来像你在想的计数器。