3 回答
TA贡献1909条经验 获得超7个赞
所以它应该有 3 个学生和 4 个科目的 12 个元素(3 乘以 4)。
您在这里要求的是CROSS JOIN学生和科目之间的关系,它将为您提供这两个表的笛卡尔积。这是重要的部分。通过交叉连接学生和科目,您可以获得所有学生和所有科目的组合。
然后,您可以使用表格LEFT JOIN的那部分,如下所示:marks
SELECT marks.id AS mark_id,
students.name AS student,
marks.mark AS mark,
subjects.name AS subject
FROM students CROSS JOIN subjects
LEFT JOIN marks
ON students.id = marks.student_id AND marks.subject_id = subjects.id;
请参阅http://sqlfiddle.com/#!9/57ffd8/1上的工作示例
TA贡献1864条经验 获得超6个赞
我将通过生成学生和科目的笛卡尔积来解决这个问题cross join:这为您提供了学生和科目的所有可能组合。然后,您可以带上标记left join:
select
marks.id as id,
students.name as student,
marks.mark as mark,
subjects.name as subject
from students
cross join subjects
left join marks on marks.student_id = students.id and marks.subject_id = subjects.id
DB Fiddle 上的演示:
编号 | 学生 | 标记 | 主题
---: | :-------- | ---: | :--------
1 | 谢尔盖 | 3 | 英语
2 | 德米特里 | 5 | 英语
3 | 弗拉迪斯拉夫 | 4 | 科学
4 | 谢尔盖 | 5 | 地理
5 | 弗拉迪斯拉夫 | 3 | 地理
6 | 德米特里 | 4 | 科学
7 | 弗拉迪斯拉夫 | 3 | 英语
8 | 谢尔盖 | 4 | 历史
空| 德米特里 | 空| 历史
null | 弗拉迪斯拉夫 | 空| 历史
null | 谢尔盖 | 空| 科学
null | 德米特里 | 空| 地理
TA贡献1775条经验 获得超8个赞
阅读您的帖子后,我对您的问题的看法是,没有任何请求可以产生您想要的结果。
让我们分析一下表格的语义:
Subjects 定义了所有的主题
学生定义所有学生
分数记录学生在科目中的所有测试结果
因此,在您的 MySQL 查询中,您要求引擎首先选择所有现有的学生
FROM students
然后,您要检索这些学生的所有现有分数,或者如果学生根本不存在任何分数,则为 null
LEFT OUTER JOIN marks ON students.id = marks.student
请注意,您已经在上面编写了marks.student 但定义了marks.student_id,这里假设错字。
下一步就是诀窍所在。此时,您将得到如下所示的结果:
id | student | mark
=====================
1 | Sergey | 3
2 | Dmitriy | 5
注意:出于可读性目的,我缩短了结果
您需要的下一步是加入主题表以添加他们的标签。但是像你在这里一样加入主题表......
LEFT OUTER JOIN subjects ON marks.subject = subject.id
请注意,这里再次假设拼写错误,标记.主题而不是标记.主题_id
... 只会产生 ID 位于之前通过加入 Marks 表产生的任何行中的主题的标签。
解决方案 :
我建议您定义一个表格,记录任何给定学生所学的科目。像这样的东西:
Attends
id | student_id | subject_id
============================
1 | 1 | 2
2 | 2 | 4
您的请求将如下所示:
SELECT Marks.id AS id,
Students.name AS student,
Marks.mark AS mark,
Subjects.name AS subject
FROM Students
JOIN Attends ON Students.id = Attends.student_id
JOIN Subjects ON Subjects.id = Attends.subject_id
LEFT JOIN marks ON Marks.subject = Subjects.id
编辑:正如GMB和Mathias-S 所指出的,交叉连接可能更容易,因为它不需要任何新表。
- 3 回答
- 0 关注
- 203 浏览
添加回答
举报
