MySQL分组查询每组最新的一条数据

开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录):

sql如下:

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `address` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `create_time` timestamp(0) NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of test
-- ----------------------------
INSERT INTO `test` VALUES (1, ‘张三1‘, ‘北京‘, ‘2019-09-10 11:22:23‘);
INSERT INTO `test` VALUES (2, ‘张三2‘, ‘北京‘, ‘2019-09-10 12:22:23‘);
INSERT INTO `test` VALUES (3, ‘张三3‘, ‘北京‘, ‘2019-09-05 12:22:23‘);
INSERT INTO `test` VALUES (4, ‘张三4‘, ‘北京‘, ‘2019-09-06 12:22:23‘);
INSERT INTO `test` VALUES (5, ‘李四1‘, ‘上海‘, ‘2019-09-06 12:22:23‘);
INSERT INTO `test` VALUES (6, ‘李四2‘, ‘上海‘, ‘2019-09-07 12:22:23‘);
INSERT INTO `test` VALUES (7, ‘李四3‘, ‘上海‘, ‘2019-09-11 12:22:23‘);
INSERT INTO `test` VALUES (8, ‘李四4‘, ‘上海‘, ‘2019-09-12 12:22:23‘);
INSERT INTO `test` VALUES (9, ‘王二1‘, ‘广州‘, ‘2019-09-03 12:22:23‘);
INSERT INTO `test` VALUES (10, ‘王二2‘, ‘广州‘, ‘2019-09-04 12:22:23‘);
INSERT INTO `test` VALUES (11, ‘王二3‘, ‘广州‘, ‘2019-09-05 12:22:23‘);

平常我们会进行按照时间倒叙排列然后进行分组,获取每个地址的最新记录,sql如下:

SELECT * FROM(SELECT * FROM test ORDER BY create_time DESC) a GROUP BY address

但是查询结果却不是我们想要的:

执行时间按倒叙排列结果为:

所以真正想要得到的结果是id为2/8/11的记录,上面的查询得到的却是1/5/9,这是为什么呢?

因为在mysql5.7的时候,子查询的排序已经变为无效了,可能是因为子查询大多数是作为一个结果给主查询使用,所以子查询不需要排序的原因。

那么我们应该怎么查呢,有两种方式:

第一种:

SELECT * FROM(SELECT * FROM test ORDER BY create_time DESC LIMIT 10000) a GROUP BY address

结果为:

对子查询的排序进行limit限制,此时子查询就不光是排序,所以此时排序会生效,但是限制条数却只能尽可能的设置大些

第二种:

SELECT t.* FROM (SELECT address,max(create_time) as create_time FROM test GROUP BY address) a LEFT JOIN test t ON t.address=a.address and t.create_time=a.create_time

通过MAX函数获取最新的时间和地址(因为需要按照地址分组),然后作为一张表和原来的数据进行联查,

条件就是地址和时间要和获取的最大时间和地址相等,此时结果为:

效率问题,还没有进行比较,待续...

原文地址:https://www.cnblogs.com/java-spring/p/11498457.html

时间: 2024-08-02 18:05:18

MySQL分组查询每组最新的一条数据的相关文章

【MySQL】【13】分组查询取每组最新的一条数据

前言:获取所有用户填写的最新一条地址数据 正文: 错误写法: mysql5.7时,子查询的排序已经变为无效了 SELECT * FROM (SELECT * FROM address ORDER BY create_time DESC) a GROUP BY user_id 方法1: 此时子查询就不光是排序,所以此时排序会生效,但有条数限制 SELECT * FROM (SELECT * FROM address ORDER BY create_time DESC LIMIT 10000) a

mysql分组查询获取组内某字段最大的记录

id sid cid 1 1 12 1 23 2 1 以sid分组,最后取cid最大的那一条,以上要取第2.3条 1 方法一: 2 select * from (select * from table order by cid desc) as a group by a.sid 3 4 方法二: 5 select a.* from table as a where cid = (select max(cid) from table where a.sid = sid) 6 7 方法三: 8 se

分组查询 每组最高的某条记录

需求是 查询每个班 年龄最小的那个人 ,需要显示如下: SQL 语句如下: select id,SUBSTRING_INDEX(GROUP_CONCAT(age order by age),',',1) as age,SUBSTRING_INDEX(GROUP_CONCAT(username order by age),',',1) as userNamefrom personGROUP BY id 原文地址:https://www.cnblogs.com/refuge/p/9061383.ht

Oracle和MySQL分组查询GROUP BY

Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段必须在GROUP BY后边出现,否则会报错:“ORA-00979: not a GROUP BY expression”.而MySQL则不同,如果SELECT出来的字段在GROUP BY后面没有出现,那么会随机取出一个值,而这样查询出来的数据不准确,语义也不明确.所以,作者建议在写SQL语句的时候,

Mysql 分组查询出现'this is incompatible with sql_mode=only_full_group_by'的解决办法

由于Mysql自动开启了 only_full_group_by,所以若查询的字段不在group by里面,则分组报错. 解决办法其一:mysql配置,关闭only_full_group_by,这种办法自行百度 下面说第二种办法: 除去group_by 以外的参数加上any_value(*) 如:SELECT type_id,any_value(`name`)  FROM ts_product GROUP BY type_id; Mysql 分组查询出现'this is incompatible

两张表一对多的连接,取多记录表中最新的一条数据

select sn, pname, srnum, rerepairtime, rn from ( select sn,pname, srnum, rerepairtime,row_number() over(partition by assetsid order by rerepairtime desc) rn from atzserreportb ) where rn = 1 两张表一对多的连接,取多记录表中最新的一条数据

mysql 分组查询数据

今天项目BOSS提了个sql语句需求,我听得稀里糊涂,没办法,一步步讨论.实践,最终搞定. 先上建表语句: 1 /* 2 Navicat MySQL Data Transfer 3 4 Source Server : localhost_3306 5 Source Server Version : 50623 6 Source Host : localhost:3306 7 Source Database : demo 8 9 Target Server Type : MYSQL 10 Targ

mysql分组查询时,讲多个值合并在一行显示

mysql根据字段进行分组查询时,相同字段的数据,只会显示一个,如果要想让这个字段的所有数据,显示在一行里,可以在查询时用GROUP_CONTAT函数,默认数据合并以逗号,分开

mysql 分组查询问题 group_concat

这几天在做购物车的时候.购物车内的商品为一个商品占一行,结果再从数据库读出的时候,没有分组,而是循环所有的内容出来,然后进行判断.如果一样的话就把他保存到一个变量中.但是自己逻辑没搞清楚.一直出bug. 偶然间想起了 sql语句中分组查询.突然才明白 就是进行分组查询.按照店铺分组 然后里边的详细商品用 group_concat函数进行组合 select 店铺ID,group_concat(shangPinID) shangPinIDs  from 购物车 group by 店铺ID 其中 sh