使用多个表分组多列

Group by 经常与 join 语句一起使用。我们假设我们有两个表。第一个是学生表:

ID 全名 年龄
1 马特琼斯 20
2 弗兰克蓝 21
3 安东尼天使 18

第二张表是每个学生可以参加的主题表:

Subject_Id 学科
1 数学
2 PE
3 物理

因为一个学生可以参加很多科目,一个科目可以由很多学生参加(因此 N:N 关系),我们需要有第三个边界表。我们称之为 Students_subjects:

Subject_Id 学生卡
1 1
2 2
2 1
3 2
1 3
1 1

现在让我们说我们想知道每个学生参加的科目数量。这里独立的 GROUP BY 语句是不够的,因为信息不能通过单个表获得。因此我们需要将 GROUP BYJOIN 语句一起使用:

Select Students.FullName, COUNT(Subject Id) as SubjectNumber FROM Students_Subjects
LEFT JOIN Students
ON Students_Subjects.Student_id = Students.Id
GROUP BY Students.FullName

给定查询的结果如下:

全名 SubjectNumber
马特琼斯 3
弗兰克蓝 2
安东尼天使 1

对于更复杂的 GROUP BY 使用示例,假设学生可能能够多次为同一主题分配相同的主题(如表 Students_Subjects 所示)。在这种情况下,我们可以通过 GROUPing 按多列来计算每个主题分配给学生的次数:

SELECT Students.FullName, Subjects.Subject,
COUNT(Students_subjects.Subject_id) AS NumberOfOrders
FROM ((Students_Subjects
INNER JOIN Students
ON Students_Subjcets.Student_id=Students.Id)
INNER JOIN Subjects
ON Students_Subjects.Subject_id=Subjects.Subject_id)
GROUP BY Fullname,Subject

此查询提供以下结果:

全名 学科 SubjectNumber
马特琼斯 数学 2
马特琼斯 PE 1
弗兰克蓝 PE 1
弗兰克蓝 物理 1
安东尼天使 数学 1