我有以下数据:
Student.Name; Student.RollNum; Student.Email; Student.Courses; Student.Birthday; Course.ID;课程名; Course.Instructor
现在是我提出的数据库设计:两个表=>学生,课程 Student.ID是添加的新字段 - >学生表的主要唯一键
现在查询John Doe(其Student.ID = 1234)所有课程的查询是什么?
我需要课程的名称,而不是ID。
答案 0 :(得分:2)
我会设计3个表:
Students - ID; Name; RollNum; Email; Birthday;
Courses - ID; Name; Instructor
Students_Courses - a join table between the students and the courses
然后你可以做以下
SELECT c.Name
FROM Students s
INNER JOIN Students_Courses sc
ON s.id = sc.studentId
INNER JOIN Courses c
ON sc.course_id = c.courseid
WHERE s.id = 1234
如果您不想要任何学生信息,可以将查询缩短为:
SELECT c.Name
FROM Students_Courses sc
INNER JOIN Courses c
ON sc.course_id = c.courseid
WHERE sc.studentId = 1234
答案 1 :(得分:0)
我会添加一个第三个表来加入学生和课程。这将允许许多学生参加许多课程。该表将存储StudentId和CourseId。然后,您可以使用以下查询获得所需的结果:
SELECT c.Id, c.CourseName
FROM Courses c
INNER JOIN StudentCourse sc
ON c.CourseId = sc.CourseId
WHERE sc.StudentId = 1234
答案 2 :(得分:0)
作业? 你需要一个新的表格,比如说学生课程,它代表学生和他参加的课程之间的关系。您需要将CourseId添加到Course表中。因此,StudentsCourses定义为:
StudentCourses(StudentId, CourseId)
此时,您通过加入获得有人参加的课程:
SELECT Courses.*
FROM Courses JOIN StudentsCourses sc ON sc.CourseId = Courses.CourseId
WHERE sc.StudenId = [DesideredStudentId]
答案 3 :(得分:0)
你的桌面设计存在缺陷。您将所有课程列在一个列(Student.Courses)中,并且您无法使用该列中的单个项目的可移植sql。您需要第三个表(注册),它将studentID与courseID(可能还有一年/一个学期)配对。
但假设你添加这个表,sql看起来像这样:
SELECT c.Name
FROM Enrollments e
INNER JOIN Courses c on c.ID = e.CourseID
WHERE e.StudentID = 1234
答案 4 :(得分:0)
实际上你需要一个第三个表来保存每个学生所学的课程,可以像2列表一样简单(StudentId,CourseId),查询将是
SELECT c.Name
FROM Students as s
JOIN CoursesTaken as t on t.StudentId = s.Id
JOIN Courses as c on c.id = t.CourseId
WHERE s.Id = 1234