以下代码适用于您现在拥有的数据库结构,下面是一个更好的解决方案
php 中最快的方法是尽可能少地选择信息。可以加入表,但是加入速度很慢,所以我们尝试其他方法。您可以为每门课程选择主题的名称,这样每次查询对数据库的负担就会减轻,但是您正在分配小查询,因此您也不喜欢这样。
我建议的方法选择所有主题并将它们存储在一个数组中。通过将键设置为与主题的 id 相同,您可以通过该键进一步访问信息,这非常快。
// Select all subjects:
$qSubj = "SELECT id,name FROM Subjects";
$sSubj = mysql_query($qSubj) or die(mysql_error()); // note: die() isnt pretty, and mysql_ should be mysqli_
// Set the variable which is going to store our information:
$subjects = array();
// For each row found, add a line:
while($fSubj = mysql_fetch_assoc($sSubj)){
$subjects[ $fSubj['id'] ] = $fSubj; // here we save it, $subjects[2] will have the information of 'Science'
}
// Now we have the subjects, we can continue to the larger table:
$qStudent = "SELECT id,name,subjects FROM Students";
$sStudent = mysql_query($qStudent ) or die(mysql_error()); // note: die() isnt pretty, and mysql_ should be mysqli_
// Now we have selected the users, loop through them:
while($fStudent = mysql_fetch_assoc($sStudent )){
// Here you can do whatever you want :) Im not a fan of echoing in this stage of the code
// I prefer storing everything in something like $template, and output it at the end
echo $fStudent['name'].' has following subjects: ';
$courses = explode(",", $fStudent['subjects']); // By exploding on the comma, youhave them seperatly:
foreach($courses as $k =>$subject_id){ // for each subject, get the name
echo $subjects[ $subject_id ]['name'].' '; // Here we can use the information we stored earlier
}
}
更好的解决方案:
您现在在 while() 中有一个 foreach() 来获取用户。如果你有几行,这没什么大不了的,但如果你有 100 多行要显示,这个 foreach 循环会使其变慢。更好的方法是添加另一个表,将它们链接起来:
主题:id,姓名
学生:id,姓名
student_subject:student_id,subject_id。
最后一个表与您的 student.subjects 列大致相同,但这是在数据库中,而不是在 php 中的数组中。PHP 和循环不是最好的朋友,您应该在 student_subject 的表中添加连接,并将学生的 while() 中的 foreach() 替换为查询以选择该学生的所有 subject_id。