我的mysql数据库中有以下三个表:
成绩:
id | st_id | Q1 | Q2 |
---|---|---|---|
1 | 20001 | 93 | 89 |
2 | 20002 | 86 | 84 |
3 | 20003 | 82 | 83 |
4 | 20001 | 86 | 89 |
5 | 20002 | 89 | 54 |
6 | 20003 | 81 | 94 |
科目:
id | 主题 | 年 |
---|---|---|
1 | 英语 | 2023 |
2 | 数学 | 2023 |
3 | 科学 | 2023 |
成绩_科目:
sbj_id | st_id | grd_id |
---|---|---|
1 | 20001 | 20001 |
1 | 20002 | 20002 |
1 | 20003 | 20003 |
2 | 20001 | 20001 |
3 | 20002 | 20002 |
2 | 20003 | 20003 |
grades表包含一个id(主键)student_id和测验分数。一个student_id可以在此表中出现多次。
主题表是一个带有主键的简单主题列表。
grades_subject 表通过科目 id、年级 id 将两者链接起来(st_id 将另一个表与学生信息链接起来)。这三个都是主键。
如您所见,一个科目 ID 可以在此表中出现多次,因为成绩表中的每个学生可以有多个科目。 20001 出现两次,一次是科目 id 1,另一次是科目 id 2,以此类推。每个科目 id 也可以出现多次,因为成绩表中的多个 Student_id 可以共享一个科目。
我正在努力获取成绩表中的所有记录,并按科目 ID 分组。所以结果是:
sbj_id 1 ...然后是该班级的所有学生及其各自的成绩。 sbj_id 2...所有科目都是如此。
我尝试了该网站的各种解决方案以及不同类型的连接、分组的多种组合,还使用了不同的选择。我要么得到重复的值,要么成绩表中的记录正确,但只有 2 个 subject_id,或者每个科目的学生成绩重复以及其他不准确的结果。我也尝试过子查询。
这是我得到的最接近正确结果的结果(我知道我不需要在下面的查询中按grades_subject.sbj_id进行分组,它只是为了证明它有效):
SELECT grades.*, grades_subject.sbj_id
FROM grades
JOIN grades_subject ON grades.st_id = grades_subject.grd_id
where grades_subject.sbj_id = 49
group by grades_subject.sbj_id, grades_subject.grd_id
它会得出该班级所有学生的所有分数,这表明在我当前的设置下,我应该能够通过正确的查询或分组获得我正在寻找的内容。当我删除 where 子句时,我应该获取每个 sbj_id,然后获取该科目的所有学生及其分数,然后是下一个科目等。但是,它将检索该科目中第一个学生的分数,然后将这些结果复制到该科目的所有其他学生如下所示:
sbj_id | st_id | Q1 | Q2 |
---|---|---|---|
1 | 20001 | 93 | 89 |
2 | 20001 | 93 | 89 |
3 | 20001 | 93 | 89 |
4 | 20002 | 93 | 89 |
5 | 20002 | 93 | 89 |
6 | 20003 | 93 | 89 |
Select Distint 不起作用,各种联接类型不起作用,在成绩表中按 id 选择和分组不起作用(包括主 id)。而不是列出我尝试过的所有不起作用的东西......
如何在不更改表设置的情况下使用当前设置获得所需的结果,因为其他表和编码都是基于其构建的。该设置适用于我需要的所有其他类型的查询,除非我试图获取所有科目的所有学生成绩。如果我必须改变设置,请详细说明最简单的方法。
谢谢你。
@P.Salmon 很早就回答了:
“无法处理已发布的数据 - 也许联结表中的 grd_id 已被错误转录,因为它与 st_id 相同,并且表名称为 Grade_subject,但您确实需要在某处进行评分的关系。”
我试图通过仅使用 1 个链接表来使数据库尽可能高效,该链接表充当与其他几个表的多对多链接表。其他表没有在原始问题中显示,因为没有必要,但这就是为什么grades_subject链接表中有重复的列,因为它们充当其他表的外键。
正如 @P.Salmon 所说,这不会像我尝试的那样有效。我重新设计了数据库,现在有许多链接到学生信息表的多对多链接表。也许将来,这可以作为 MYSQL 中的一项功能添加,因为如果其他表中的列具有相同的标识符,那么只有一个链接表而不是多个链接表会很棒。
我无法选择原始评论作为答案。