2010-09-02 30 views
1

我有3代表的受试者学生,和关系
下面是样本数据PHP的MySQL joinget导致

 
students table 
id name 
1  John 
2  Doe 
3  Jane 

subject table 
id subject 
1  Math 
2  Science 
3  English 

relation table 
id student_id subject_id 
1  1    1 
2  1    3 
3  2    1 
4  1    2 

ID此时sudent = 1具有3科目。我怎样才能得到这样的结果?

 
student name is John 
subjects are: 
Math 
Science 
English 

我已经得到了学生的价值观,我想要做的就是给用户显示他的主题。 我完全混淆了使用连接表。我是一名PHP新手,上周我开始学习。我的代码出现错误。请帮忙。
我Cuurent代码是这样的:

 
<?php 
//mysql connection 

$query = " 
    SELECT *,* FROM relation, subject 
    on subject_id = id 
    WHERE student_id = $student_id 
"; 
$result = mysql_query($query); 
?> 
Student name is <?php echo $name ?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($result)) { 
    echo $row["subject"]; 
} 
?> 

回答

0

简单的方式做到这一点,是查询所有学生:

SELECT * FROM `students`; 

,然后循环在PHP中的结果,现在各行的你必须使另一个查询来获取学生的科目:

SELECT * FROM `subject` WHERE `id` IN (SELECT subject_id FROM relation WHERE student_id={$student_row['id']}) 

假设$student_row是你选择用于分配牵强把名称记录下来。

现在,您执行一个嵌套循环来获取此查询,并打印学生的主题。

+0

为什么要打扰两个查询?这正是SQL旨在通过JOIN处理的数据构造类型。 – 2010-09-02 17:44:44

+0

@Marc,他说他是新手,所以我想给出一个简单的实现,注意它以*开始*简单的方法是* – aularon 2010-09-02 17:46:42

2

首先确保您的查询是正确的。我认为这是你要找的东西:

SELECT subjects.* 
FROM subjects, 
INNER JOIN relations ON relations.subject_id = subjects.id 
WHERE relations.student_id = $student_id 

它可能支付在MySQL客户端(例如,phpMyAdmin)检查它。你会注意到在SELECT部分​​我只有主题*,因为这就是你所需要的。

1

实际上,我会问一个面试问题,以排除那些没有基本SQL知识但在简历中声明这是直接实现的人。它可以导致有关数据库设计,规范化,反规范化等一个很好的交谈

什么我希望看到的是基本的加入语法齐头并进与您创建的关系表。

“从关系中选择主题内部联结关系.subject_id = subjects.id where relations.student_id =?”。

考虑下一步就可以了,你去

从“选择对象内部联接上relations.subject_id = subjects.id内部联接学生relations.student_id = students.student_id其中students.name =关系话题?” 。

如果您不想将内部数据库密钥公开给外部用户,则允许您在不预先获取学生ID的情况下进行查询。

问号是用于变量绑定的,它罕见的是它的合理实践不能逃避数据库交互的输入。查询的变量绑定是一个很好的覆盖这个问题的简单方法。

我喜欢把这个设计问题当作一个面试问题,因为它可以快速导致关于SQL注入的讨论,如何净化Web表单输入以及数据管理,Web应用程序开发和数据库设计中的一般最佳实践。

1

有这种情况的GROUP_CONCAT()聚合函数:

SELECT students.id, students.name, GROUP_CONCAT(subject.subject) AS subjects 
FROM students 
LEFT JOIN relation ON students.id = relation.student_id 
LEFT JOIN subject ON relation.subject_id = subject.id 
GROUP BY students.id 
ORDER BY students.name 

将返回这样的数据:

+-------------+---------------+------------------------+ 
| students.id | students.name | subject.name   | 
+-------------+---------------+------------------------+ 
| 1   | John   | Math, English, Science | 
| 2   | Doe   | Math     | 
| 3   | Jane   | NULL     | 
+-------------+---------------+------------------------+ 

你可以做到这一点没有分组,在这种情况下,你会得到一个为每个id /学生姓名/学科名称排行,然后你可以使用一个简单的状态机,如OMG Ponies的显示部分答案。

1
<?php 
//mysql connection 
function query($query){ 
global $conn; 
$qu=mysqli_query($conn,$query); 
return $qu; 
} 

$query1 =query(" 
    SELECT * FROM student 
    WHERE student_id = $student_id 
"); 
$query2=query("SELECT * FROM relation, subject 
    WHERE relation.student_id = $student_id 
    AND subject.id=relation.subject_id 
"); 
$name=mysqli_fetch_assoc($query1); 
?> 
Student name is <?=$name['name']?><br /> 
Subjects are:<br /> 
<?php 
while($row = mysql_fetch_array($query2)) { 
    $rew[]=$row['subject'];//For store subject 
    echo $row["subject"]; 
} 
    $subject=join(",",$rew);//Get the stored subject from array 
?> 

也许可以帮助你吗?