我有两门课。在每个课程中,都有一些作业。一个学生可以同时参加这两个课程。
我有以下表格: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表,因为您可以通过课程表中的标记来推断学生的课程注册。