mysql的group by查询

时间:2023-11-10 09:16:01

下面是多种写法,针对使用group by后得到最新记录的测试及结果:

说明:我在测试的时候,因为我的表数据在增加,得到最新的数据可能不同

 -- 1、得到每个分组中id最小的那条记录
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03'
group by point_code
-- 37033746 XX00016 长江大桥路口 http://xxx/10.58.237.73_01_20180903001241103.jpg 2018-09-03 00:12:41
-- 37033631 XX00024 沱六桥路口 http://xxx/10.25.77.3_01_20180903000355528.jpg 2018-09-03 00:03:55
-- 37033485 XX00025 高新区立交桥 http://xxx/10.210.98.143_01_20180903000211230.jpg 2018-09-03 00:02:11 -- 2、意图,先通过子查询,按照ID降序,得到每个分组中最新的一条记录
select * from
(
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03' order by id desc -- limit 1000
) tt
group by point_code;
-- 结果还是每个分组最小的记录,与第一种写法结果相同 -- 3、在第二种写法的子查询周添加了一个limit,limit后面的数字大于你查询的总条数即可
select * from
(
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03' order by id desc limit 10000000000
) tt
group by point_code;
-- 结果返回每个分组中最新的那条记录
-- 37064239 XX00016 长江大桥路口 http://xxx/10.58.237.73_01_20180903144242037.jpg 2018-09-03 14:42:42
-- 37064240 XX00024 沱六桥路口 http://xxx/10.25.77.3_01_20180903143857383.jpg 2018-09-03 14:38:57
-- 37064139 XX00025 高新区立交桥 http://xxx/10.210.98.143_01_20180903143713651.jpg 2018-09-03 14:37:13 -- 4、在第一中写法的group by后面添加一个desc
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03'
group by point_code desc
-- 返回结果是每个分组的最新记录
-- 37064139 XX00025 高新区立交桥 http://xxx/10.210.98.143_01_20180903143713651.jpg 2018-09-03 14:37:13
-- 37064240 XX00024 沱六桥路口 http://xxx/10.25.77.3_01_20180903143857383.jpg 2018-09-03 14:38:57
-- 37064239 XX00016 长江大桥路口 http://xxx/10.58.237.73_01_20180903144242037.jpg 2018-09-03 14:42:42 -- 5、一般我们在查询结果都会按照一定规则进行排序,对第四种写法进行排序
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03'
group by point_code desc order by point_code
-- 返回结果又变成了每个分组的最小记录了
-- 37033746 XX00016 长江大桥路口 http://xxx/10.58.237.73_01_20180903001241103.jpg 2018-09-03 00:12:41
-- 37033631 XX00024 沱六桥路口 http://xxx/10.25.77.3_01_20180903000355528.jpg 2018-09-03 00:03:55
-- 37033485 XX00025 高新区立交桥 http://xxx/10.210.98.143_01_20180903000211230.jpg 2018-09-03 00:02:11 -- 6、将第五种写法的排序,放到分组外边
select * from
(
select * from pic where point_code in('XX00024', 'XX00016', 'XX00025') and addtime > '2018-09-03'
group by point_code desc
) t order by point_code
-- 返回的结果又是每个分组的最新值
-- 37064239 XX00016 长江大桥路口 http://xxx/10.58.237.73_01_20180903144242037.jpg 2018-09-03 14:42:42
-- 37064240 XX00024 沱六桥路口 http://xxx/10.25.77.3_01_20180903143857383.jpg 2018-09-03 14:38:57
-- 37064139 XX00025 高新区立交桥 http://xxx/10.210.98.143_01_20180903143713651.jpg 2018-09-03 14:37:13

在使用group by希望得到最新的数据时,如果想采用子查询先行排序,注意需要添加limit才会生效,这是我的测试结果

网上百度了一些,许多博客,没有写limit好像也生效了,不知道是不是mysql不同的版本问题。

好像只能针对单表进行这样操作,表连接好像就没有效果了