Сценарий
У меня есть база данных MySQL с 10 000 строк. Настройка базы данных:
ID UniqueKey Name Url Score ItemValue
1 5Zvr3 Google google.com 13 X
2 46cfG Radio radio.com -20 X
3 2fg64 Yahoo yahoo.com 5 X
.... etc etc etc
Как видите, у каждого элемента есть оценка. Счет постоянно меняется. Сейчас у Google может быть 13 баллов, а завтра может быть 80 или -50.
Что я хочу:
Я хочу создать систему, которая создает иерархию в моей текущей базе данных на основе оценки элементов. Прямо сейчас я думаю о процентильном ранге, что означает, что элементы с наивысшей оценкой будут близки к 100 %, а элементы с наименьшей оценкой будут близки к 0 %. Для этого я создал код, который попытается добиться того, что показано здесь: http://www.psychstat.missouristate.edu/introbook/sbk14m.htm
Это мой код:
$sql = "SELECT * FROM database order by Score";
$result = $conn->query($sql);
$count = 0;
while ($row = $result->fetch_assoc()) {
$woow = $row['Score'];
$sql = "SELECT * FROM database WHERE Score = $woow";
$resultnew = $conn->query($sql);
$somanythesame = $resultnew->num_rows;
$itemPercentile = ( ($count/$result->num_rows + 0.5*$somanythesame/$result->num_rows) * 100 );
$rowID = $row['ID'];
$sql2 = "UPDATE database SET itemValue = $itemPercentile WHERE ID = $rowID";
$conn->query($sql2);
$count++;
}
Это работает, но есть одна проблема: в моей базе данных есть много элементов, многие из которых имеют одинаковую оценку. Чтобы проиллюстрировать мою проблему, вот очень простая база данных из 10 строк, содержащая только баллы:
Оценки
-10
0
0
0
10
20
20
30
40
50
Проблема с моим кодом заключается в том, что он не дает один и тот же процентиль для элементов с одной и той же оценкой, потому что он принимает во внимание все предыдущие строки для расчета, включая те, у кого одинаковый счет.
Итак, для 2-го, 3-го и 4-го элемента с Score of 0
должно быть так: (1/10 + 0.5*1/10) * 100
. Проблема в том, что для третьего элемента будет выполнено (2/10 + 0.5*1/10) * 100
, а для четвертого элемента будет выполнено (3/10 + 0.5*1/10) * 100
.
Затем для 5-го элемента с оценкой 10 он должен выполнить (4/10 + 0.5*1/10) * 100
. Это идет хорошо; только не для предметов с одинаковым счетом.
Я не уверен, что объяснил это хорошо, мне трудно выразить свою проблему правильными словами. Если у вас есть какие-либо вопросы, дайте мне знать! Спасибо за уделенное время :)