快捷搜索:  汽车  科技

mysql8.0分组查询前n条记录(mysql分组查询最新时间的数据)

mysql8.0分组查询前n条记录(mysql分组查询最新时间的数据)SELECT * FROM ( SELECT * FROM customer_antigen ORDER BY REPORT_TIME DESC LIMIT 10000 ) a GROUP BY CUSTOMER_ID结果——查出最新时间记录这种方法不推荐,如果数据量很大的话会漏掉很多数据。 原因:mysql在分组group by的时候,默认取的排序后的id的第一条,而且mysql是先执行group by,后执行 order by的,所以排序是分组之后的事。加上desc后,由默认id升序变为降序SELECT * FROM customer_antigen GROUP BY CUSTOMER_ID DESC方法三:先子查询排序 limit 1000,再根据客户id分组原因:mysql 5.7 默认是子查询里排序是失效的,加上limit才有效。

业务需求:查询出客户多次做的核酸信息的最新的一条。

mysql8.0分组查询前n条记录(mysql分组查询最新时间的数据)(1)

想要查出的数据——同组最新时间的一条

方法一:子查询找出按客户id分组中的最新的时间,再左连接找出对应的客户信息。

SELECT b.* FROM ( SELECT max( REPORT_TIME ) REPORT_TIME FROM customer_antigen GROUP BY CUSTOMER_ID ) a LEFT JOIN customer_antigen b ON a.REPORT_TIME = b.REPORT_TIME

方法二: 按降序分组查询,在group by 字段 后面加上 desc 降序

原因:mysql在分组group by的时候,默认取的排序后的id的第一条,而且mysql是先执行group by,后执行 order by的,所以排序是分组之后的事。加上desc后,由默认id升序变为降序

SELECT * FROM customer_antigen GROUP BY CUSTOMER_ID DESC

方法三:先子查询排序 limit 1000,再根据客户id分组

原因:mysql 5.7 默认是子查询里排序是失效的,加上limit才有效。

这种方法不推荐,如果数据量很大的话会漏掉很多数据。

SELECT * FROM ( SELECT * FROM customer_antigen ORDER BY REPORT_TIME DESC LIMIT 10000 ) a GROUP BY CUSTOMER_ID

mysql8.0分组查询前n条记录(mysql分组查询最新时间的数据)(2)

结果——查出最新时间记录

总结:mysql三种查出同组中最新时间的记录,方法一,是最有效的,因为子查询只查了一个字段。方法二,可能会出现bug,若是插入时间在最新一条时间之前,降序查找就会找到时间次新的一条记录。方法三,不推荐,数据量太大会出问题。

猜您喜欢: