-2

我正在为学生创建一个数据库。

我创建了一个表“主题”

ID    NAME
1     Maths
2     Science
3     Biology
4     Social Studies

我创建了另一个表“学生”

ID    Name         Subject
1     Ram          1,2,3
2     Shyam        1,3,4
3     Hanuman      1,2,3,4

我想将学生的姓名检索到一个 php 页面中并显示他们的科目,我该怎么做:

Name          Subject
Ram           Maths, Science, Biology
Shyam         Maths, Biology, Social Studies 

等等

我是 PHP、MySQL 的新手。

4

4 回答 4

4
  1. 起点是从学生表中删除主题
  2. 并创建一个名为student-subject的“数据透视表”

例如:

+------------+------------+
| student_id | subject_id |
+------------+------------+
| 1          | 1          |
| 1          | 2          |
| 1          | 3          |
| 2          | 1          |
+------------+------------+
于 2013-07-29T20:02:19.627 回答
1

就像其他人指出的那样,您的架构确实不是最佳的,但您可以使用此查询实现您想要做的事情:

select st.Name, group_concat(su.name ORDER BY su.ID)
from Students st
inner join Subjects su on concat(',',st.Subject,',') like concat('%,',su.ID,',%')
group by st.Name

请参阅 SQLFIDDLE:http ://sqlfiddle.com/#!2/79286d/8/0

于 2013-07-29T20:11:32.293 回答
1

以下代码适用于您现在拥有的数据库结构,下面是一个更好的解决方案 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。

于 2013-07-29T20:17:29.507 回答
-2

您还可以检索主题列,将结果分解为一个数组,然后通过 foreach 语句查找每个主题的名称。

$subjects = array(1,2,3);

foreach ($subjects as $subject){
    $result = $db->query("SELECT `name` FROM `Subjects` WHERE `ID` = $subject");
         while($row = $result->fetch_assoc()) {
            echo $row['name'];
    }
}
于 2013-07-29T20:09:28.223 回答