解决mysql分组后排序 取最新一条数据的问题

最近遇到一个统计报表的需求,数据按照某个字段分组后,其他列取最新一条数据的列。
在百度一番之后,并没有找到想要的答案。
数据库:mysql

在使用传统的查询后,发现order by 是无效的。相信各位童鞋也是一样的情况。
select id,gate_id,sum(vehicle_num) as vehicle_num,com_name from t_report_gate GROUP BY gate_id ORDER BY id desc;

这里相信童鞋了解到使用内联查询,例如(这里内联表必须加limit,否则order by无效):
select id,gate_id,sum(vehicle_num) as vehicle_num,com_name from (select * from t_report_gate order by id desc limit 100000) GROUP BY gate_id;
这样是可以的,但是有个问题,这里limit后加多少合适呢?如果你确定你的表在未来也绝对不会超过你设置的这个值,比如小公司内部应用的项目,那么这样写没什么问题,但是如果对大表做统计查询,一旦表数据超过了这个值就会导致溢出的数据没有被统计到。

最后跟朋友讨论后,使用了substring_index 和 group_concat函数 ,再配合自连接 获取到了想要的数据。
不废话了,具体sql如下:

SELECT
	t.com_id,
	t.gate_name,
	t.com_name,
	t.report_date,
	s.id,
	s.vehicle_num,
	s.gate_id 
FROM
	t_report_gate t,
	(
SELECT
	SUBSTRING_INDEX( GROUP_CONCAT( id ORDER BY id DESC ), ',', 1 ) AS id,
	gate_id,
	sum( vehicle_num ) AS vehicle_num 
FROM
	`t_report_gate` 
WHERE
	report_date >= 20190101 
	AND report_date <= 20200101 
GROUP BY
	gate_id 
ORDER BY
	vehicle_num ASC 
	) s 
WHERE
	t.id = s.id

思路:
1.先通过group_concat函数 可以对id进行排序后拼接,否则排序是无效的。
2.然后通过substring_index截取到排序后的第一个id,也就是最新一条数据的id。
(这里我是用id降序的,如果你要取最新一条被修改的数据的id,也可以使用GROUP_CONCAT( id ORDER BY updateTime DESC ))
3.统计字段 和 统计函数 照常使用。内部也可以进行一次统计后的排序。
4.自连接 通过两个id匹配, 统计相关的列用 内部数据, 其他字段通过匹配最新数据的id后取最新id行的列。

不知道能否解决各位的问题。

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值