对MySQL数据库中的列值进行排名

时间:2014-12-12 17:52:48

标签: php mysql

我正在对数据库中的值执行排名练习。每列是一年,每列有76个值(即每年76行)。这些年份是从1980年到2035年。我的脚本必须依次遍历每年(列),并对值进行排名(即按升序排列,然后吐出相关的ID)。

我已经编写了下面的脚本,但是它可以工作,但是我认为它需要三秒钟才会很慢。对于第一列(1980),它很快,因为我可以一次插入它们。对于其他人,我不能,因为我需要更新表,因此匹配行 - 这导致每个值单独的SQL查询。

有更好的方法吗?这是我的代码:

for ($x = 1980; $x <= 2035; $x++) {
    $sql="SELECT `ID`,`$x` FROM marginal_costs ORDER BY `$x`";
    $concat = "";
    $counter = 1;
    $result = mysqli_query($con,$sql);

    while($row = mysqli_fetch_array($result)) {
        if($x==1980) {
             $concat = $concat."('".$row['ID']."'), ";
        } else {   
             $upload="UPDATE `merit_order` SET `$x`='".$row['ID']."' WHERE `ID`='$counter';";
             echo $upload;
             mysqli_query($con, $upload);
             $counter= $counter + 1; 
        }
    }

    if($x==1980) {
        $concat = substr_replace($concat, "", -2).";";
        $upload="INSERT INTO `merit_order` (`$x`) VALUES $concat;";
        mysqli_query($con, $upload);
    }
}

1 个答案:

答案 0 :(得分:1)

您的代码会向您的数据库发送大量SQL,从而产生不必要的通信。这是你可以优化的一件事......两个选择:

  • 你编写了一个存储过程来完成这一切,所以你优化了一点通信,但是你给db了一些额外的工作;
  • 尝试最小化您使用的SQL数量:尝试获取一次数据(构建一个大选择,您可以选择所有内容,所有年份);在php中排名;然后构造一些更新(例如每个id)并插入,并将它们发送到db;你完成了:)