mysql中group by子句和聚合函数MAX(),MIN(),SUM(),AVG()等的使用

时间:2022-09-23 13:24:06

1.问题产生的原因:

  使用group by 子句和聚合函数同时使用时,可能会出现需要的信息跟预期不符的情况,如有下表:

CREATE TABLE t_exampaper (
  id varchar(32) NOT NULL,
  know_id varchar(32) NOT NULL COMMENT '章/节编号',
  exam_type int(1) NOT NULL COMMENT '0:章节考试,1:练习,2:综合考试',
  score double DEFAULT 0 COMMENT '学生考试得分',
  start_time datetime DEFAULT NOW(),
  end_time datetime DEFAULT NOW(),
  course_id varchar(32) NOT NULL,
  user_id varchar(32) NOT NULL,
  apply_time datetime DEFAULT NULL,
  PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

用group by 和聚合函数MAX()查询本表 :某一用户同一个章/节(know_id相同)记录中score最大的记录,即先分组,再在组内求最大值。

如果使用如下查询语句,那么得出来的主键id会产生混乱的现象,即一个id对应了不属于自己的信息

Bad example:

SELECT id, course_id, know_id, exam_type,user_id,MAX(score)
FROM t_exam_paper WHERE user_id='XXXXXXXXX' GROUP BY know_id;

本语句执行后,对know_id进行分组,然后在分组中读取第一条记录作为最大值,而不是如预期中的在组内获取最大值

2.问题解决方法:

可以通过在group by 语句后添加having条件,在having条件中进行聚合运算。

correct example:

SELECT id, course_id, know_id,score,exam_type,user_id
FROM t_exam_paper WHERE user_id='XXXXXXXXX' GROUP BY know_id,score HAVING score = MAX(score)


感谢博文:http://blog.csdn.net/q1054261752/article/details/48156177