当前位置:   article > 正文

MySQL中MAX函数与Group By一起使用记录信息不一致_select max 字段和其他字段没有一致

select max 字段和其他字段没有一致

如果想要查询某个字段的分组,并且把分组里最大值及其对应的记录信息查询出来,一般会用GROUP BYmax一块用,但是这里面有一个坑。

mysql> select * from test;
+----+-------+------+-------+
| id | name  | age  | class |
+----+-------+------+-------+
|  1 | qiu   |   22 |     1 | 
|  2 | liu   |   42 |     1 | 
|  4 | zheng |   20 |     2 | 
|  3 | qian  |   20 |     2 | 
|  0 | wang  |   11 |     3 | 
|  6 | li    |   33 |     3 | 
+----+-------+------+-------+
6 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

如果想找到每个class里面的最大的age,则需要使用group by和max。
如下的sql语句,则输出结果有错误:

mysql> select id,name,max(age),class from test group by class;
+----+-------+----------+-------+
| id | name  | max(age) | class |
+----+-------+----------+-------+
|  1 | qiu   |       42 |     1 | 
|  4 | zheng |       20 |     2 | 
|  0 | wang  |       33 |     3 | 
+----+-------+----------+-------+
3 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

新版本Mysql直接无法执行,除非设置sql_mode=only_full_group_by

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains 
nonaggregated column 'test.test.id' 
which is not functionally dependent on columns in GROUP BY clause;
 this is incompatible with sql_mode=only_full_group_by

$ set sql_mode=' '
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# 查找当前sql_mode
SELECT @@sql_mode;
# 查询的一般结果:
# ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

# 全局设置sql_mode(对新建的库生效)
SET @@global.sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

# 对已建好的库生效
SET sql_mode ='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

虽然找到的age是最大的age,但是与之匹配的用户信息却不是真实的信息,而是group by分组后的第一条记录的基本信息
如果我使用以下的语句,先排序,后分组,进行查找,则可以返回真实的结果。

mysql> select * from (select * from test order by age desc) as b group by class;
+----+-------+------+-------+
| id | name  | age  | class |
+----+-------+------+-------+
|  2 | liu   |   42 |	 1 | 
|  4 | zheng |   20 |	 2 | 
|  6 | li	|   33 |	 3 | 
+----+-------+------+-------+
3 rows in set (0.00 sec)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

另外一种方法 (推荐)
就是先查出最大的值,然后根据这个值来查找对应的记录。

select * from test t where t.age = (
select max(age) from test where t.class = class
) order by class;  
  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/952727
推荐阅读
相关标签
  

闽ICP备14008679号