原理:主表 left join 关联自己,然后匹配左表时间小于右表时间,这样匹配出来的数据右表的数据为null时,说明该条数据时间为最新,加上条件右表字段为null,即筛选成功。

    1. -- 创建测试表及填入数据
    2. USE database;
    3. CREATE TABLE IF NOT EXISTS `test` (
    4. `id` int(11) NOT NULL AUTO_INCREMENT,
    5. `userid` int(11) NOT NULL COMMIT '用户id',
    6. `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',
    7. PRIMARY KEY (`id`)
    8. ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
    9. BEGIN;
    10. INSERT INTO `test` VALUES (1, 12, '2019-07-01 01:01:01');
    11. INSERT INTO `test` VALUES (2, 34, '2019-07-01 01:01:01');
    12. INSERT INTO `test` VALUES (3, 56, '2019-07-01 01:01:01');
    13. INSERT INTO `test` VALUES (4, 78, '2019-07-01 01:01:01');
    14. INSERT INTO `test` VALUES (5, 78, '2019-07-01 01:02:02');
    15. INSERT INTO `test` VALUES (6, 12, '2019-07-01 01:02:02');
    16. INSERT INTO `test` VALUES (7, 12, '2019-07-01 01:03:03');
    17. INSERT INTO `test` VALUES (8, 56, '2019-07-01 01:02:02');
    18. COMMIT;
    19. SET FOREIGN_KEY_CHECKS = 1;
    20. -- 查询
    21. 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;