mysql中的group by问题
GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
在 MySQL 中,不加聚合函数的情况下,返回的结果是分组后每组结果集中的第一行;如果打开相关配置,选择的字段不必在 GROUP BY 中存在(注意:mysql8中该配置默认是关闭的,即:必须在 GROUP BY 中出现)。
如果在SELECT语句中使用GROUP BY子句,而不使用聚合函数,则GROUP BY子句的行为与DISTINCT子句类似。
SELECT Froute_code FROM db_ccm_cx.t_ride_record_201807 GROUP BY Froute_code
返回的结果是分组后每组结果集中的第一行,但如果我们是想返回重复 Froute_code 中最新的一条,就需要借助排序了(例如:根据ID或时间倒序),但直接在原sql上加order by 语句是不生效的,因为 GROUP BY 会比 ORDER BY 先执行,没有办法在 GROUP BY 的各个 group 中进行针对某一列的排序。
只要在 GROUP BY 前将顺序调整好,把你希望的数据排在最前面,那么 GROUP BY 时就能顺利取到这个数据。故解决方法就是先进行你想要的排序,然后在此排序后的结果集的基础上,进行 GROUP BY 操作。比如下面 SQL:
对于mysql5.5版本:
select * from ( select * from table_name order by create_time desc ) as t group by t.id;
对于mysql 5.7及以上版本,需要加入limit限制,否则不生效
select * from ( select * from table_name order by create_time desc limit 100000 ) as t group by t.id;
但是这种写法如果数据量大于Limit 的值后,结果就不准确了。所以我们看第二种写法。
利用max() 函数:(根据业务,亲测不是MAX(id)结果不准确)
SELECT * FROM tb_dept td,(SELECT max(id) id FROM tb_dept GROUP BY parent_id) md where td.id = md.id;
利用 where 字段名称 in (...) 函数(但是不宜过长,有说in有个数限制,1000个,也有提到in本身没有限制,但是sql本身长度是有限制的max_allowed_packet,默认是4M。我还没有验证,在此先记录一下):
SELECT * FROM tb_dept WHERE id IN (SELECT MAX(id) FROM tb_dept GROUP BY parent_id);
参考文章:
https://blog.csdn.net/qq_39706515/article/details/126297233
https://www.jb51.net/article/250825.htm
https://zhuanlan.zhihu.com/p/271103544