1

我已经挂断了 php 中根据他们的表现将我的用户分配到“联盟”所需的逻辑。基本上,每月一次,我将运行一个 cron 作业,它将获取我的用户列表及其平均数据,如下所示

SELECT user_id, AVG(activity_value) AS `average` 
FROM usermeta 
WHERE activity_date >= DATE_ADD(CURDATE(), INTERVAL -7 DAY) 
GROUP BY user_id 
ORDER BY average DESC

这将返回我的用户列表和他们的平均值,这将决定他们在联赛中的位置(最好的用户在顶部)。

我有一个联赛表,它像这样简单地存储联赛 ID 及其名称

league_id   league_name  
1           Gold
2           Silver
3           Bronze

然后我有一个关系表,将用户和排名表联系在一起,一旦我确定了逻辑,它(应该)看起来像这样

user_id   league_id  
2         1
3         1
1         2
6         2
5         3
4         3

ETC...

我被挂断的地方是将用户插入正确的联赛所需的逻辑。也有可能有更多的联赛。例如,如果有 36 个用户和 4 个联赛,则每个联赛应该有 9 个用户。

到目前为止,我的 cron 工作是在执行时运行它(只是为了让您了解我的进度)

protected function execute() {
    $leagues = $this->app['leagues'];
    $userAvgs = $leagues->getAllUserAvgs(); // holds results from query shown above

    foreach($userAvgs as $user) {
        $league = new League(array(
            'user_id'  => $user['user_id'],
            'league_id' => THE_CORRECT_LEAGUE_HERE
        ));
        $leagues->save($league);
    }
}

在 foreach 的每个循环中,它应该将用户及其适当的联赛存储到关系表中,但我只是迷失了如何运行它并确定我需要为用户league_id 插入的正确联赛。我想我需要每个联赛都有正确的用户数,这可能是

$usersPerLeague = count($userAvgs)/count($leagues->getAllLeagues()); 
// getAllLeagues method returns a list of my leagues obviously

如果有人能在这个过程中引导我朝着正确的方向前进,我将不胜感激。

4

3 回答 3

0

您的用户按平均排序,因此只需执行

$usersPerLeague = count($userAvgs)/count($leagues->getAllLeagues()); 
$current_league =1;
$i=0;
foreach($userAvgs as $user) {
    $i++:
    if($i%9==0) $current_league++;
    $league = new League(array(
        'user_id'  => $user['user_id'],
        'league_id' => $current_league
    ));
    $leagues->save($league);
}

替代解决方案:

像这样为您的请求添加等级:

 $sql = SELECT user_id, AVG(activity_value) AS `average`, @rownum := @rownum + 1 AS rank
 FROM usermeta ,(SELECT @rownum := 0) r
 WHERE activity_date >= DATE_ADD(CURDATE(), INTERVAL -7 DAY) 
 GROUP BY user_id 
 ORDER BY average DESC

如果排名 < usersPerLeague => 联赛 1 如果排名 < 2*usersPerLeague => 联赛 2 等等。

于 2013-12-27T21:49:46.720 回答
0

这是一个替代解决方案

$all_leagues= $leagues->getAllLeagues();
$all_users = $users->getAllUserAvgs();
$num_leagues = count($all_leagues);
$num_users = count($all_users);
$usersPerLeague = $num_users / $num_leagues;


$a=0;
$b=0;
foreach($all_users as $user) {
    $a++;
    if($a % $usersPerLeague == 0){
       $b++;
    }
    $league = new League(array(
        'user_id'  => $user['user_id'],
        'league_id' => $all_leagues[$b]
    ));
    $leagues->save($league);
}

在 sql 顺序中,您可以添加 user_id 顺序

ORDER BY average,user_id DESC
于 2013-12-27T22:04:39.683 回答
0
$leagues = array_chunk($players, $playerCount/$leagueCount);

// loop thru leagues are from 0 to leaguecount - 1
foreach($leagues as $leagueNum => $players){
    foreach($players as $player){
        // use league + 1 to make leagues from 1 to league count
        $league = new League(array(
            'user_id'  => $player['user_id'],
            'league_id' => $leagueNum +1
        ));
        $leagues->save($league);
    }
}
于 2013-12-27T22:13:47.283 回答