使用多个表分组多列
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 BY
与 JOIN
语句一起使用:
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 |