2013-04-09 136 views
2

如果这个问题有点模糊,请让我知道,我会提供更多信息。mysql从多个表中选择查询返回重复结果

我已经写了一个查询,从多个表中获取数据,但它不工作,我也很期待它,我完全难住了。

这里是我的代码:

SELECT students.student_fname, students.student_lname 
FROM students, enrolments 
WHERE enrolments.courseID = 'C001'; 

但这只是返回所有的学生姓和名的学生表,这些名字出现了两次。

下面是两个表的代码:

CREATE TABLE students 
(
studentID CHAR(10) NOT NULL, 
student_fname VARCHAR(15) NOT NULL, 
student_lname VARCHAR(15) NOT NULL, 
DOB VARCHAR(10) NOT NULL, 
CONSTRAINT pk_students PRIMARY KEY (studentID) 
); 

CREATE TABLE enrolments 
(
enrolmentNo int NOT NULL AUTO_INCREMENT, 
studentID CHAR(10) NOT NULL, 
courseID CHAR(4) NOT NULL, 
CONSTRAINT pk_enrolments PRIMARY KEY (enrolmentno), 
FOREIGN KEY (studentID) REFERENCES students (studentID), 
FOREIGN KEY (courseID) REFERENCES courses (courseID) 
)ENGINE = INNODB; 
+1

这将有助于了解这两个表以及它们是如何的表结构‘相关’来更好地支持你的问题,这样想一下,系统有一个关于所有学生和所有入学的列表,它假设所有入学都是针对每个学生的,因为你没有告诉系统它们是如何关联的。 – xQbert 2013-04-09 01:27:14

+0

在问题 – Michael 2013-04-09 01:53:12

+0

中加入了这些根据表格设计,我没有看到有关StudentID,enrolmentNo和courseID的唯一索引,因为这样的学生可以多次注册同一个课程,因此可以使用不同的/分组。一年/学期如果有人通过/失败并重新获得...在不同的学期和inf ormation是谨慎的... – xQbert 2013-04-09 02:02:45

回答

3

这是因为您尚未定义学生与注册相关的方式。

您可能需要使用内部连接或添加where子句来显示它们之间的关系。

例如:

FROM Students 
INNER JOIN enrolments on Students.ID = enrolments.studentID 

或者

FROM students, enrolements 
WHERE enrolments.studentID = students.ID 

第一种方法是较新的,并通过许多优选的;但传统方法也受支持。

为了更好地理解表连接来看看这个最优秀的文章:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

否则,你得到了什么叫两个表中的所有数据涉及到的所有数据的笛卡尔乘积。

如果你没有一个独特的enrolements索引(学生只能有一个班级注册),那么select Distinct field nameswhere... group by fields也将限制你的结果,以接近你正在寻找的。

============================在回复后续评论=========== ========

SELECT S.student_fname, S.student_lname 
FROM students S 
INNER JOIN enrolments E 
    ON S.StudentID = E.StudentID 
WHERE e.courseID = 'C001' 
GROUP BY S.Student_Fname, S.Student_lname 
ORDER BY S.Student_LName, S.Student_FName 

该组通过消除同一课程的重复。 的“ON语句告诉数据库学生如何与注册。 由订单仅仅是提供一个合理的以结果。

+0

如果学生入学表没有唯一的索引,这可能是真的。但是,如果系统限制登记重复,这不会成为基于特定类别限制的问题。 – xQbert 2013-04-09 01:35:05

+0

非常感谢,看它如何工作帮助我让我的头脑。干杯 – Michael 2013-04-09 02:57:28

0

你不能用这种方式获取两个表中的数据。你必须加入表格。