Это немного сложный вопрос, который я пытался решить как можно больше с помощью только запроса, но я не смог сделать это точно. У меня есть полу-решение в 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 = ",";
}
}
}
}
}
}
Задача ещё не решена.
Других решений пока нет …