2012-08-08 58 views
0

请帮我看看这个solution.im处理一个非常大的数据记录,如2M的学生测试结果记录。所有记录都存储在一个表中,我需要做的是单独这个记录分成两个不同的表格,一个用于所有通过学生,另一个用于失败学生。在分开这个记录之后,我需要从源表格中删除原始记录。每当我运行这个代码时,它需要几个小时才能完成。如果任何人都可以帮助我找出解决方案,这将是非常棒的。谢谢。移动大记录表的最快方法mysql

这里是示例代码:

<?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(); ?> 
+1

为什么不干脆添加一个布尔列来显示学生是否通过或失败? – 2012-08-08 09:04:27

+0

避免使用**选择** *,而不是使用字段 – 2012-08-08 09:08:02

回答

1

你不应该从数据库读取的所有数据,然后通过行发回重新排。

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

做这样的事情,而不是:

INSERT INTO table1 
(col1, col2, ... coln) 
SELECT col1, col2, ... coln 
FROM table2 
WHERE result = 'PASS' 
+0

很好解释,+1 – 2012-08-08 09:12:39

+0

我明白了,我即将试用它,非常感谢您的建议。 – tora 2012-08-10 15:29:01

+0

亲爱的马克,用这种querry INSERT INTO table1的 (COL1,COL2,......科隆) SELECT COL1,COL2,......科隆 当我可是从表2 WHERE结果= 'PASS' 我怎样才能添加的合格率给学生,并删除记录,而我没有运行任何循环?谢谢 – tora 2012-08-10 15:38:11

0

你可以从while循环中删除查询和运行外循环查询,但生成loop.i内的查询字符串的意思,而不是每次查询运行你可以通过一个查询插入的所有数据,你可以尝试以下解决方案

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( '')值(破灭( '',$值)))

+0

非常感谢Sumit,它是一个有用的资源 – tora 2012-08-10 15:30:00

相关问题