我有两门课。在每个课程中,都有一些作业。一个学生可以同时参加这两个课程。
我有以下表格: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
应该看起来如下:
  

这是我的代码:

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]')");
                }

            }


        }

    }

?>


问题是针对课程1,仅插入了第一个student_index分配值。对于同一个student_index,值也插入到两个单独的行中。我要尝试做的是,当我们考虑课程1中的一行时,该记录由student_index标识,该行应具有该学生的所有作业标记。我该如何实现?

也就是说,我有两条记录与表course1的条件相匹配,为945568。
course1中,它仅获取965的插入记录,并且看起来也如下所示。 。在相同的index_no下,两行应为一

为了检查在while循环中先出现了什么问题,我使用了echo $index[0]。它同时打印945,568。但是在另一个while循环内的if语句中,仅输出945。那是第二次运行循环时,我认为$result2=mysql_query("SELECT * FROM courses WHERE course_no='Course1' AND st_index='$index[0]'");行未执行。

最佳答案

问题在于,在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表,因为您可以通过课程表中的标记来推断学生的课程注册。

09-25 23:27