https://segmentfault.com/a/1190000006821331
在平时的开发任务中我们经常会用到 MYSQL 的 GROUP BY 分组, 用来获取数据表中以分组字段为依据的统计数据。比如有一个学生选课表,表结构如下:
Table: Subject_Selection
Subject Semester Attendee
ITB001 1 John
ITB001 1 Bob
ITB001 1 Mickey
ITB001 2 Jenny
ITB001 2 James
MKB114 1 John
MKB114 1 Erica
我们想统计每门课程有多少个学生报名,应用如下 SQL:
SELECT Subject, Count(*)
FROM Subject_Selection
GROUP BY Subject
得到如下结果:
Subject Count
ITB001 5
MKB114 2
因为表里记录了有 5 个学生选择 ITB001,2 个学生选择了 MKB114。
产生这个结果的原因是:
GROUP BY X 意思是将所有具有相同 X 字段值的记录放到一个分组里。
那么 GROUP BY X, Y 呢?
GROUP BY X, Y 意思是将所有具有相同 X 字段值和 Y 字段值的记录放到一个分组里。
我们下面再接着要求统计出每门学科每个学期有多少人选择,应用如下 SQL:
SELECT Subject, Semester, Count(*)
FROM Subject_Selection
GROUP BY Subject, Semester
上面 SQL 的意思是,对 Subject_Selection 表中的数据进行分组,将具有相同 Subject 和 Semester 字段值的记录放到同一个分组里去, 然后对每个分组中的数据应用聚合函数(COUNT,SUM, AVG,etc)。
得到的结果是:
Subject Semester Count
ITB001 1 3
ITB001 2 2
MKB114 1 2
从表中的记录我们可以看出这个分组结果是正确的有 3 个学生在第一学期选择了 ITB001, 2 个学生在第二学期选择了 ITB001,
还有两个学生在第一学期选择了 MKB114, 没人在第二学期选择 MKB114。
再比如有一个订单表,表中记录了所有支付过的订单
Table: Order
Product Buyer Spending
PD001 Todd 12.00
PD001 Todd 12.00
PD001 Todd 12.00
PD001 Lily 12.00
PD001 Lily 12.00
PD002 Todd 20.00
PD002 Todd 20.00
现在我们想统计每个用户在每种商品上总共花了多少钱,执行如下 SQL
SELECT Product,Buyer, SUM(Spending)
FROM Order
GROUP BY Product, Buyer
获得的结果如下:
Product Buyer SUM
PD001 Todd 36.00
PD001 Lily 24.00
PD002 Todd 40.00
总结:
在 MYSQL 中使用 GROUP BY 对表中的数据进行分组时,
GROUP BY X 意思是将所有具有相同 X 字段值的记录放到一个分组里,
GROUP BY X, Y 意思是将所有具有相同 X 字段值和 Y 字段值的记录放到一个分组里。
参考链接:
http://stackoverflow.com/questions/2421388/using-group-by-on-multiple-columns