原理:主表 left join 关联自己,然后匹配左表时间小于右表时间,这样匹配出来的数据右表的数据为null时,说明该条数据时间为最新,加上条件右表字段为null,即筛选成功。
例
-- 创建测试表及填入数据USE database;CREATE TABLE IF NOT EXISTS `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`userid` int(11) NOT NULL COMMIT '用户id',`time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;BEGIN;INSERT INTO `test` VALUES (1, 12, '2019-07-01 01:01:01');INSERT INTO `test` VALUES (2, 34, '2019-07-01 01:01:01');INSERT INTO `test` VALUES (3, 56, '2019-07-01 01:01:01');INSERT INTO `test` VALUES (4, 78, '2019-07-01 01:01:01');INSERT INTO `test` VALUES (5, 78, '2019-07-01 01:02:02');INSERT INTO `test` VALUES (6, 12, '2019-07-01 01:02:02');INSERT INTO `test` VALUES (7, 12, '2019-07-01 01:03:03');INSERT INTO `test` VALUES (8, 56, '2019-07-01 01:02:02');COMMIT;SET FOREIGN_KEY_CHECKS = 1;-- 查询SELECT a.* FROM database.test a LEFT JOIN database.test b ON a.userid = b.userid AND a.time < b.time WHERE b.userid IS NULL;
