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

《PhP / MySQL:如何动态更改我的(大型且不断变化的)数据库》

这是我的代码:

$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;
}
点赞