group by 和 order by 一起使用时,会先使用group by 分组,并取出分组后的第一条数据,所以后面的order by 排序时根据取出来的第一条数据来排序的,但是第一条数据不一定是分组里面的最大数据。
只有指定字段获取到最大值
SELECT id, max(operat_time) FROM tb GROUP BY id;
只有指定字段获取到最小值
SELECT id, min(operat_time) FROM tb GROUP BY id;
还可以先排序,再分组,再排序:使用子查询。
SELECT * FROM (
SELECT t.* ORDER BY t.dev_time DESC
LIMIT 10000
)o
GROUP BY assetId
注意 5.7版本要在子查询中加 limit10000000
放到生产环境,报错:
Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'o.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
原因:
mysql5.7以上默认开启了only_full_group_by 模式
1、进入mysql命令,查看sql_mode
SELECT @@sql_mode;
如图
mysql> SELECT @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@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 |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
先关闭mysql
service mysql stop
linux 进入 /etc ,修改 my.cnf
在[mysqld]下增加
sql_mode=NO_UNSIGNED_SUBTRACTION,NO_ENGINE_SUBSTITUTION
vi my.cnf 打开 my.cnf
按住shift输入“:”,使文件变成可查询状态;
输入 “/” + 要修改的内容,回车 (例如:要修改服务器地址和端口号);
定位到要修改的位置后按 i 键变成可编辑状态,对要修改的内容进行修改
按ESC键,退出修改状态
按住shift输入“:”,使文件变成可查询状态
输入 wq!回车,保存修改;输入 q!,不保存修改;
启动mysql