我有两门课程。每门课程都有几个作业。学生可以学习这两门课程
我有以下表格: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]')");
}
}
}
}
?>
问题在于course1只插入了第一个student_index赋值。同样,对于相同的student_index,值将被插入到两个单独的行中。我想要做的是当我们在course1中考虑一行时,由student_index标识该行应该具有该学生的所有分配标记。我怎样才能做到这一点?
也就是说我有两条记录符合表course1
的条件为945,568
在course1
中,它只会插入965的记录,它也如下所示。 。这两行应该是一个,在相同的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]'");
没有被执行。
答案 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表,因为您可以通过课程表中的标记来推断学生在课程中的注册。