【问题标题】:query from 5 joined tables从 5 个连接的表中查询
【发布时间】:2018-04-02 21:42:35
【问题描述】:

所以我有 5 个表如下:

CREATE TABLE student (
  id   serial PRIMARY KEY,
  name varchar(255) NOT NULL
  -- other columns, constraints, etc...
);
CREATE TABLE teacher (
  id   serial PRIMARY KEY,
  name varchar(255) NOT NULL
  -- other columns, constraints, etc...
);
CREATE TABLE course(
  id   serial PRIMARY KEY,
  name varchar(255) NOT NULL
  -- other columns, constraints, etc...
);
CREATE TABLE student_course (
  student_id integer NOT NULL REFERENCES student(id),
  course_id  integer NOT NULL REFERENCES course(id)
);
CREATE TABLE teacher_course (
  teacher_id integer NOT NULL REFERENCES teacher(id),
  course_id  integer NOT NULL REFERENCES course(id)
);

我想查询哪个学生和哪个老师学习什么课程。

SELECT s.name, c.name, t.name
FROM student s
  JOIN student_course sc ON s.id = sc.student_id
  JOIN course c ON sc.course_id = c.id
  JOIN teacher_course tc ON c.id = tc.course.id
  JOIN teacher t ON tc.teacher_id = t.id

但结果不是我想要的。就像 1 名学生和 2 名不同的老师一起学习一门学科。这不是输入问题,因为我检查并在teacher_course 和student_course 中都没有重复输入。所以我认为问题出在我的查询上。谁能告诉我哪里出错了?

【问题讨论】:

  • 你能发布输出吗?
  • @AkankhaAhmed 我刚刚做到了。请检查一下
  • 嘿。您在这里提供数据示例sqlfiddle.com/#!9/6479c9/1 来重现问题会很复杂吗?查询乍一看似乎没问题。另外,您使用的是什么版本的 MySQL?
  • 您的结果并未显示所有列。
  • 可能是在黑暗中拍摄,但你可以试试这个版本的查询:'SELECT s.name, c.name, t.name FROM student s, student_course sc, course c, teacher_course tc , 老师 t WHERE s.id = sc.student_id AND sc.course_id = c.id AND c.id = tc.course_id AND tc.teacher_id = t.id' 从技术上讲它应该做同样的事情,但是......谁知道呢。

标签: mysql sql


【解决方案1】:

试试这个

 SELECT 
    s.name as Student_Name,
    c.name as Course_Name,
    t.name as Teacher_Name

From student s

inner join student_course sc on s.id = sc.student_id 
inner join course c on sc.course_id = c.id
inner join teacher_course tc on tc.course_id =c.id 
inner join teacher t on tc.course_id = t.id;

结果:

【讨论】:

  • 谢谢!这行得通,结果我只需要反转 PK 和 FK。无论我离开还是内部加入,我仍然得到相同的结果。你能解释一下吗?我认为无论你把FK还是PK放在第一位都没有什么不同。
  • 还有,为什么结果是重复的。你能告诉我如何不显示重复的结果吗?
  • @AcousticMike 没有重复值。是的,2 名学生可以选修同一位老师可以选修的一门课程。例如,第 2 列“oren”和“Nathaniel”选修 Jacob Harteman 选修的相同课程。为什么在老师和 course_name 是重复条目.
  • 但是,如果要删除重复条目,可以在选择查询后使用“distinct”。
【解决方案2】:

您的 sql 语句似乎正确。不过我使用了 LEFT JOIN,因为默认情况下 JOIN 是一个 INNER JOIN(请参阅What is the default MySQL JOIN behaviour, INNER or OUTER?)。但是,根据您的表语法,我使用 JOIN 和 LEFT JOIN 应用了 sql 语句,我收到了相同的结果。无论如何,我的带有 LEFT JOINs 的 sql 语句是:

SELECT 
    s.*,
    c.*,
    t.*
FROM student AS s
LEFT JOIN student_course AS sc ON sc.student_id = s.id
LEFT JOIN course AS c ON c.id = sc.course_id
LEFT JOIN teacher_course AS tc ON tc.course_id = c.id
LEFT JOIN teacher AS t ON t.id = tc.teacher_id;

如果问题如您所说 - “像 1 个学生和 2 个不同的老师一起学习一门学科” - 那么原因只能是您将多个 teacher_ids 分配给表teacher_courses中相同的course_id

请注意,一名教师可以教授多门课程的情况是有效的。例如。在teacher_course 中允许多个course_ids 具有相同的teacher_id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2023-03-20
    相关资源
    最近更新 更多