来自多个表的mysql select查询返回重复的结果

时间:2013-04-09 01:19:34

标签: mysql duplicates

如果这个问题有点模糊,请告诉我,我会提供更多信息。

我已经编写了一个查询,从多个表中获取数据,但它没有按照我的预期进行操作,而且我完全被难倒了。

这是我的代码:

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;

2 个答案:

答案 0 :(得分: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的唯一索引(学生只能有1个班级注册),那么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语句告诉数据库学生与注册的关系。 订单只是为了给结果提供合理的订单。

答案 1 :(得分:0)

您无法以这种方式从两个表中获取数据。你必须加入表格。