3

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

我编写了一个从多个表中获取数据的查询,但它也没有按照我的预期工作,我完全被难住了。

这是我的代码:

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;
4

2 回答 2

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

否则,您会得到两个表的笛卡尔积,所有数据都与所有数据相关。

如果您没有关于注册的唯一索引(一个学生只能注册 1 个班级),那么 a select Distinct field namesorwhere... 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

group by 消除了同一课程的重复项。“ON 语句告诉数据库学生与注册的关系。顺序只是为了提供一个合理的结果顺序。

于 2013-04-09T01:22:07.990 回答
0

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

于 2013-04-09T01:22:03.743 回答