<导航

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

 

posted @ 2022-11-23 23:38  字节悦动  阅读(521)  评论(0编辑  收藏  举报