多对多关系获取所有分组记录

问题描述 投票:0回答:1

我的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)。而不是列出我尝试过的所有不起作用的东西......

如何在不更改表设置的情况下使用当前设置获得所需的结果,因为其他表和编码都是基于其构建的。该设置适用于我需要的所有其他类型的查询,除非我试图获取所有科目的所有学生成绩。如果我必须改变设置,请详细说明最简单的方法。

谢谢你。

mysql sqlalchemy mysql-python
1个回答
0
投票

@P.Salmon 很早就回答了:

“无法处理已发布的数据 - 也许联结表中的 grd_id 已被错误转录,因为它与 st_id 相同,并且表名称为 Grade_subject,但您确实需要在某处进行评分的关系。”

我试图通过仅使用 1 个链接表来使数据库尽可能高效,该链接表充当与其他几个表的多对多链接表。其他表没有在原始问题中显示,因为没有必要,但这就是为什么grades_subject链接表中有重复的列,因为它们充当其他表的外键。

正如 @P.Salmon 所说,这不会像我尝试的那样有效。我重新设计了数据库,现在有许多链接到学生信息表的多对多链接表。也许将来,这可以作为 MYSQL 中的一项功能添加,因为如果其他表中的列具有相同的标识符,那么只有一个链接表而不是多个链接表会很棒。

我无法选择原始评论作为答案。

© www.soinside.com 2019 - 2024. All rights reserved.