问题描述
我有4个表,其中三个是多对多关系:
并且学生与小组之间的关系是一对多
- 学生(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
,
基于注释:查询很好;您缺少与您想要的结果相匹配的数据。
- 没有具有groupID的学生
- 在组表中没有任何组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
。如果您只是在上完课并属于小组的学生之后,那么他们都需要成为内部联接。只是取决于你在追求什么!
左联接将说包括先前数据联接中的所有记录,并且仅包括与该联接匹配的记录(在示例中为分组)