mysql и PHP назначают очки пользователям из пула очков и ранжируют

Это немного сложный вопрос, который я пытался решить как можно больше с помощью только запроса, но я не смог сделать это точно. У меня есть полу-решение в PHP, но иногда это не получается.

Сначала, чтобы объяснить ситуацию, я создаю своего рода систему MVP. Когда только 3 лучших игрока получают очки, это нормально, однако я сталкиваюсь с проблемами, когда в голосовании присутствует ничья.

Точка распространения будет

1st place 3 points
2nd place 2 points
3rd place 1 point

Для общего пула 5 баллов. На данный момент у меня есть рекурсивная функция в php, которая в основном работает, она берет оставшиеся баллы и делит ее между оставшимися местами размещения, мне просто интересно, можно ли это решить за один запрос.

Так что вы можете получить это

Player 1 = 10 votes
players 2 = 9 votes
player 3 = 9 votes.

Так что здесь разброс очков должен быть

Player 1 = 3 points
Player 2 = 1.5 points
player 3 = 1.5 points (remaining points in pool divided by 2 players)

И снова то же самое относится, где бы это ни совпало

Итак, еще раз, если у вас было

player 1 = 10 votes
player 2 = 10 votes
player 3 = 9 votes
Player 4 = 9 votes

При обстоятельствах выше, точка распространения

Player 1 & Player 2 = 2.5 points
Player 3 & Player 4 = 0.5 points

Поэтому я считаю, что могу сделать это с помощью рекурсивной функции php, которая просто вычисляет что-то вроде оставшиеся_пункты / Players_left

Это по какой-то причине иногда дает сбой, и в конечном итоге я хотел бы иметь возможность сделать это из одного запроса и не беспокоиться о прокачке через функции PHP.

Или какие-то другие мысли о том, как этого добиться?

ура
Дэн

  • РЕДАКТИРОВАТЬ 1: Для раскрытия, это функция, которую я написал давным-давно на PHP, которая в основном работала, но я думаю, что она, вероятно, слишком специфична для объема стекового потока. Это может помочь нарисовать картину, хотя

    function stpoty_update_standings($round, $season)   {
    global $db;
    
    //Do the calculation to update the standings. We could probably do this without extra storage but will leave it as is for now.
    $player_points = $db->write_query("Select vote, sum(points) as points from ".TABLE_PREFIX."stpoty_votes where round_id=".intval($round)." group by vote order by points DESC");
    $gpoints=3;
    
    while($pps=$db->fetch_array($player_points))    {
    
    $users_run = explode(",", $user_collection);
    
    if(in_array($pps["vote"], $users_run)==false)   {
    
    if($gpoints!='0')   {
    //lets check how many people have these points
    $equal_vote = $db->write_query("Select count(vote) from ".TABLE_PREFIX."stpoty_votes where round_id=".intval($round)." group by vote HAVING sum(points)=".$pps["points"]." order by points DESC LIMIT 1");
    $equal_votes = $db->num_rows($equal_vote);
    //now we have a count we can do what we need to do
    if($equal_votes==1) {
    //We have one user on this score so we can just update their record, we need to check if they exist to perform the right action
    $exists = $db->write_query( "SELECT points FROM ".TABLE_PREFIX."stpoty_standings where comp=".intval($season)." and player=".intval($pps["vote"]));
    $exists = $db->fetch_field($exists, "points");
    if(!empty($exists)) {
    stpoty_update_standings_update($pps["vote"], $gpoints, $exists, $season);
    }   else    {
    stpoty_update_standings_insert($pps["vote"], $gpoints, $season);
    }
    $gpoints = --$gpoints;
    } else if ($equal_votes>=2) {
    
    //if we have two or more points we need to divide remaining points between them, and null out of the loop
    if($gpoints=='3') {
    
    //work out the division of points
    if($equal_votes==2) {
    $apoints = "2.5";
    $gpoints = "1";
    }   else if ($equal_votes>=3) {
    $apoints = 5 / $equal_votes;
    $gpoints = 0;
    }
    }   else if ($gpoints=='2') {
    //work out the division of points
    $apoints = 3 / $equal_votes;
    $gpoints = 0;
    }   else if ($gpoints=='1') {
    $apoints = 1 / $equal_votes;
    $gpoints = 0;
    }
    $comma = "";
    $players_on_points = $db->write_query("Select vote, sum(points) from ".TABLE_PREFIX."stpoty_votes where round_id=".intval($round)." group by vote Having sum(points)=".$pps["points"]." order by points DESC");
    
    while($pop=$db->fetch_array($players_on_points))    {
    
    $exist = $db->write_query( "SELECT points FROM ".TABLE_PREFIX."stpoty_standings where comp=".intval($season)." and player=".intval($pop["vote"]));
    $exists = $db->fetch_field($exist, "points");
    $user_collection .= $comma.$pop["vote"];
    if(!empty($exists)) {
    
    stpoty_update_standings_update($pop["vote"], $apoints, $exists, $season);
    }   else    {
    
    stpoty_update_standings_insert($pop["vote"], $apoints, $season);
    }
    $comma = ",";
    }
    
    }
    }
    }
    }
    }
    

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]