将数据插入从两个合并表中检索的表

时间:2015-05-17 18:18:03

标签: php mysql select insert

我有两门课程。每门课程都有几个作业。学生可以学习这两门课程 我有以下表格:courses,student_courses,course1 我的课程表有st_index,assignmnet_no,marks,course_no作为字段
 和 student_courses 表有st_index,course1,course2,如果学生按照course1或course2,则插入1。 表 course1 具有Student_Index,Assignment1,Assignment2,Assignment3作为字段。

我已将数据插入表courses,student_courses。通过从这些数据中检索数据,我想提出course1表。course1 应该看起来如下:
enter image description here

这是我的代码:

if($_SESSION['user']['course']=="Course1"){
    $result=mysql_query("SELECT student_index FROM student_courses WHERE course1=1");
    while($index=mysql_fetch_array($result)){
        echo $index[0];
        echo"<br>";
        $result2=mysql_query("SELECT * FROM courses WHERE course_no='Course1' AND st_index='$index[0]'");
        while($i2=mysql_fetch_array($result2)){
            $ass_no=$i2['assignment_no'];
            if($ass_no=='1'){
                echo $index[0];
                $result3=mysql_query("INSERT INTO course1(Student_Index,Assignment1) VALUES('$index[0]','$i2[marks]')"); 
                }
            if($ass_no=='2'){
                echo $index[0];
                $result4=mysql_query("INSERT INTO course1(Assignment2) VALUES('$i2[marks]')"); 
                }
            if($ass_no=='3'){

                $result5=mysql_query("INSERT INTO course1(Assignment3) VALUES('$i2[marks]')"); 
                }

            } 


        } 

    }

?>  

问题在于course1只插入了第一个student_index赋值。同样,对于相同的student_index,值将被插入到两个单独的行中。我想要做的是当我们在course1中考虑一行时,由student_index标识该行应该具有该学生的所有分配标记。我怎样才能做到这一点?

也就是说我有两条记录符合表course1的条件为945,568 在course1中,它只会插入965的记录,它也如下所示。 enter image description here。这两行应该是一个,在相同的index_no

为了检查第一次循环内部出错的原因我使用了echo $index[0]。它打印945,568。但是在其他while循环中的if语句中只打印了945。这是第二次运行循环时我认为行$result2=mysql_query("SELECT * FROM courses WHERE course_no='Course1' AND st_index='$index[0]'");没有被执行。

1 个答案:

答案 0 :(得分:1)

问题是在SQL中, INSERT 总是会添加一个新行。您为每个标记插入了一行,但仅为其中一个标记提供了Student_Index(因此后续行上的空索引)。您想要的 UPDATE 命令。

因此,让我们只使用INSERT一次为每个学生创建一行,就在内部WHILE之前:

INSERT INTO course1(Student_Index) VALUES('$index[0]')

然后通过将INSERT语句替换为(例如,对于赋值1)来填充字段:

UPDATE course1 SET assignment1 = '$i2[marks]' WHERE Student_Index = '$index[0]'

或者,您可以使用以下内容在SQL中完成此操作:

CREATE TABLE course1
SELECT s1.st_index,
       a1.marks AS Assignment1,
       a2.marks AS Assignment2,
       a3.marks AS Assignment3
  FROM courses a1, courses a2, course a3
 WHERE a1.course_no = 1
   AND a2.course_no = 1
   AND a3.course_no = 1
   AND a1.assignment_no = 1
   AND a2.assignment_no = 2
   AND a3.assignment_no = 3
   AND a1.st_index = a2.st_index
   AND a1.st_index = a3.st_index;

我们已经三次加入课程表,选择三个标记所在的三行,其中course_no = 1,并将它们限制为所有三行中的同一学生。这将为每个学生返回一行。此外,使用此解决方案,根本不需要引用student_courses表,因为您可以通过课程表中的标记来推断学生在课程中的注册。