0

请帮我找出这个解决方案。我处理一个非常大的数据记录,比如 2M 的学生测试结果记录。所有记录都存储在一个表中,我需要做的是将此记录分成两个不同的表,一个为所有通过学生另一个是失败的学生。分开这条记录后,我需要从源表中删除原始记录。每次我运行这段代码时,都需要几个小时才能完成。如果有人可以帮我找出解决方案会很棒。谢谢。

这是示例代码:

<?php ob_start(); ?>
<?php
function spread($classselect,$subjectselect)
{include "connectdb.php";

//movepass

$selectpass = mysql_query("SELECT * FROM testresultAUG2012 WHERE actualmonth='AUG' AND testresult = 'PASS' AND classname = '$classselect' AND educationsubject = $subjectselect;",$conn);
$totalpass = mysql_num_rows($selectpass);
$pass=0;
while($pass<$totalpass)
{
    $name=mysql_result($selectpass, $pass, "Studentname");
    $subject=mysql_result($selectpass, $pass, "Subject");
    $testbatch=mysql_result($selectpass, $pass, "testbatch");
    $classname=mysql_result($selectpass, $pass, "class");
    $lecturer=mysql_result($selectpass, $pass, "lecturer");
    $date=mysql_result($selectpass, $pass, "date");
    $month=mysql_result($selectpass, $pass, "month");
    $time=mysql_result($selectpass, $pass, "time");
    $state=mysql_result($selectpass, $pass, "result");

    //count total pass subject and add 1
    $totalpass = mysql_query("SELECT * FROM Student WHERE Studentname = '$name';",$conn);
    $only = mysql_fetch_array($theone);
    $currentpass = $only['totalpass'];
    $newpass = $currentpass + 1;
    mysql_query("UPDATE Student SET totalpass = $newpass WHERE Studentname = '$name';",$conn);

    //save record to pass table
    mysql_query("INSERT INTO passtab(......) VALUES(....);",$conn);

    //remove data from origin table
    mysql_query("DELETE FROM testresultAUG2012 WHERE Studentname = '$name' AND testbatch = $testbatch AND Subject=$subject AND result = 'PASS' AND class = '$classname';",$conn);
    $pass++;
}

//moveFailed

$selectfail = mysql_query("SELECT * FROM testresultAUG2012 WHERE actualmonth='AUG' AND testresult = 'PASS' AND classname = '$classselect' AND educationsubject = $subjectselect;",$conn);
$totalfail = mysql_num_rows($selectfail);
$fail=0;
while($fail<$totalfail)
{
    $name=mysql_result($selectfail, $fail, "Studentname");
    $subject=mysql_result($selectpass, $fail, "Subject");
    $testbatch=mysql_result($selectfail, $fail, "testbatch");
    $classname=mysql_result($selectfail, $fail, "class");
    $lecturer=mysql_result($selectfail, $fail, "lecturer");
    $date=mysql_result($selectfail, $fail, "date");
    $month=mysql_result($selectfail, $fail, "month");
    $time=mysql_result($selectfail, $fail, "time");
    $state=mysql_result($selectfail, $fail, "result");

    //count total fail subject and add 1
    mysql_query("UPDATE Student SET totalfail = totalfail + 1  WHERE Studentname = '$name';",$conn);

    //save record to fail table
    mysql_query("INSERT INTO failtab(....) VALUES(...);",$conn);


    //remove data from origin table
    mysql_query("DELETE FROM testresultAUG2012 WHERE Studentname = '$name' AND testbatch = $testbatch AND Subject=$subject AND result = 'FAIL' AND class = '$classname';",$conn);
    $fail++;
    }
}
?>
<?php
$relatedclass=$_POST[classup];
$relatedsubject=$_POST[subject];
spread($relatedclass,$relatedsubject);
echo "<center>Spread Completed !!!</CENTER>";

?>
<? ob_flush(); ?> 
4

2 回答 2

1

您不应该从数据库中获取所有数据,然后将其逐行发送回。

如果你的草坪上有一袋沙子,你想把它送给你的邻居,你会怎么做?你会给他留一张纸条告诉他他可以接受吗?或者你会先把整个袋子寄给你在俄罗斯的叔叔,然后告诉你叔叔一次一粒地寄回给你的邻居?您处理数据的方式更像是后一种方法。

改为执行以下操作:

INSERT INTO table1
(col1, col2, ... coln)
SELECT col1, col2, ... coln
FROM table2
WHERE result = 'PASS'
于 2012-08-08T09:08:26.287 回答
0

您可以从while循环中删除查询并在循环外运行查询,但在循环内生成查询字符串。我的意思是每次您可以使用一个查询插入所有数据时都运行查询,您可以尝试以下解决方案

while($pass<$totalpass)
{
    $name=mysql_result($selectpass, $pass, "Studentname");
    $subject=mysql_result($selectpass, $pass, "Subject");
    $testbatch=mysql_result($selectpass, $pass, "testbatch");
    $classname=mysql_result($selectpass, $pass, "class");
    $lecturer=mysql_result($selectpass, $pass, "lecturer");
    $date=mysql_result($selectpass, $pass, "date");
    $month=mysql_result($selectpass, $pass, "month");
    $time=mysql_result($selectpass, $pass, "time");
    $state=mysql_result($selectpass, $pass, "result");

    //count total pass subject and add 1
    $totalpass = mysql_query("SELECT * FROM Student WHERE Studentname = '$name';",$conn);
    $only = mysql_fetch_array($theone);
    $currentpass = $only['totalpass'];
    $newpass = $currentpass + 1;


    //save record to pass table
   $values[]='('.$valuestring.')'(//whatever you want to ineser)

    //remove data from origin table

    $pass++;
}

mysql_query(插入tyablename('')值(implode(',',$values)))

于 2012-08-08T09:13:02.003 回答