脚本
我有一个10,000行的MySQL数据库.数据库的设置:
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
如您所见,每个项目都有一个分数.分数在不断变化.谷歌现在可能有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
我的代码存在的问题是,它不会为具有相同分数的项目提供相同的百分位数,因为它会考虑计算的所有先前行,包括具有相同分数的行.
因此,对于得分为0的第2,第3和第4项,它应该是这样的:(1/10 0.5 * 1/10)* 100.问题是,对于第3项它会做什么(2/10 0.5 * 1/10)* 100和第4项(3/10 0.5 * 1/10)* 100.
然后,对于得分为10的第5项,它应该做(4/10 0.5 * 1/10)* 100.这很顺利;仅适用于具有相同分数的项目.
我不确定我是否解释得这么好,我发现很难用正确的词语表达我的问题.如果您有任何疑问,请告诉我们!感谢您的时间 :)
最佳答案 您需要维护一个“相同计数”($icount)变量,该变量跟踪具有相同分数的项目数和跟踪当前分数的“当前分数”($score).
$icount = 0;
$score = null;
$woow == $score(相同值检查)时增加$icount而不是$count.否则,将其添加到$count并递增,然后将$icount值重置为0.
if ($woow == $score) {
$icount++;
} else {
$count += $icount + 1;
$icount = 0;
}
最后,将$score值设置为最新的$woow,以便在循环的下一次迭代中进行测试:
$score = $woow;
这将允许具有相同分数的项目具有相同的$count值,同时在找到新的$score时增加额外的$icount次数.
您的最终代码如下所示:
$sql = "SELECT * FROM database order by Score";
$result = $conn->query($sql);
$count = 0;
$icount = 0;
$score = null;
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);
if ($woow == $score) {
$icount++;
} else {
$count += $icount + 1;
$icount = 0;
}
$score = $woow;
}