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才有效。
业务需求:查询出客户多次做的核酸信息的最新的一条。
想要查出的数据——同组最新时间的一条
方法一:子查询找出按客户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
结果——查出最新时间记录
总结:mysql三种查出同组中最新时间的记录,方法一,是最有效的,因为子查询只查了一个字段。方法二,可能会出现bug,若是插入时间在最新一条时间之前,降序查找就会找到时间次新的一条记录。方法三,不推荐,数据量太大会出问题。