如何加入4张桌子?

问题描述

我有4个表,其中三个是多对多关系:

  • 学生(StudID,GroupId,名称...)
  • 课程(课程ID,课程名称标记
  • StudentLesson(StudID,LessID)

并且学生与小组之间的关系是一对多

  • 学生(StudID,姓名,...)
  • Group(GroupId,GroupNumber)

我想要的是如何选择名称,课程名称标记,组号

select S.Name,L.LessonName,L.Mark,G.GroupNumber from Student s
join StudentLesson SL on SL.StudId = S.StudId
join Lesson L on SL.LessID = L.LessID
Join Group G on G.GroupId = S.GroupId

我认为此行Join Group G on G.GroupId=S.GroupId中的错误是因为当我忽略它时,它在多对多之间有效,但在一对多之间却不起作用。

解决方法

group是保留字,因此需要加引号。在MySQL中,您可以使用反引号:

select S.Name,L.LessonName,L.Mark,G.GroupNumber 
from Student       S
join StudentLesson SL on SL.StudId = S.StudId
join  Lesson       L  on SL.LessID = L.LessID
Join  `Group`      G  on G.GroupId = S.GroupId
,

基于注释:查询很好;您缺少与您想要的结果相匹配的数据。

  1. 没有具有groupID的学生
  2. 在组表中没有任何组ID与GROUPID匹配的学生。

要证明这一点,您可以简单地使最后一个联接成为LEFT联接,前提是您没有对Group进行限制的where子句。

从:

select S.Name,G.GroupNumber from Student s
join StudentLesson SL on SL.StudId=S.StudId
join  Lesson L on SL.LessID =L.LessID
Join Group G on G.GroupId=S.GroupId

收件人:

SELECT S.Name,G.GroupNumber 
FROM Student s
INNER JOIN StudentLesson SL on SL.StudId=S.StudId
INNER JOIN Lesson L on SL.LessID =L.LessID
LEFT JOIN Group G on G.GroupId=S.GroupId

如果groupID匹配,这将向您显示所有具有课程和groupNumber的学生;但我敢打赌,它们都将为NULL。

对于所有学生,无论他们是否有课程或小组,您也是这样吗,因此您的inner参加人数应为left。如果您只是在上完课并属于小组的学生之后,那么他们都需要成为内部联接。只是取决于你在追求什么!

左联接将说包括先前数据联接中的所有记录,并且仅包括与该联接匹配的记录(在示例中为分组)