PhP / MySQL:如何动态更改我的(大型且不断变化的)数据库
脚本
我有一个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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |