如果这个问题有点模糊,请告诉我,我会提供更多信息。
我已经编写了一个查询,从多个表中获取数据,但它没有按照我的预期进行操作,而且我完全被难倒了。
这是我的代码:
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;
答案 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 names
或where... 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)
您无法以这种方式从两个表中获取数据。你必须加入表格。