今天处理业务的时候遇到一个问题,简单一点描述就是多表查询取最值的问题,我用一个类似的场景来重现这个问题:
查询各个用户最近一次登录时间(使用的MySQL)
这里给定两个表,t_user用户表以及t_login_log登录日志表,结构如下
CREATE TABLE `t_user` (
`id` int(11) NOT NULL,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO `t_user` VALUES ('1', '张三');
INSERT INTO `t_user` VALUES ('2', '李四');
INSERT INTO `t_user` VALUES ('3', '王五');
CREATE TABLE `t_login_log` (
`id` int(11) NOT NULL,
`user_id` int(11) DEFAULT NULL,
`login_time` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- ----------------------------
-- Records of t_login_log
-- ----------------------------
INSERT INTO `t_login_log` VALUES ('1', '1', '2020-08-23 14:26:26');
INSERT INTO `t_login_log` VALUES ('2', '1', '2020-09-26 14:26:58');
INSERT INTO `t_login_log` VALUES ('3', '1', '2020-09-23 15:50:47');
INSERT INTO `t_login_log` VALUES ('4', '1', '2020-09-23 15:50:48');
INSERT INTO `t_login_log` VALUES ('5', '1', '2020-09-04 15:51:02');
INSERT INTO `t_login_log` VALUES ('6', '1', '2020-10-01 15:51:11');
INSERT INTO `t_login_log` VALUES ('7', '2', '2020-09-01 15:51:22');
INSERT INTO `t_login_log` VALUES ('8', '2', '2020-09-12 15:51:28');
INSERT INTO `t_login_log` VALUES ('9', '2', '2020-10-01 15:51:35');
INSERT INTO `t_login_log` VALUES ('10', '2', '2020-09-18 15:51:42');
当然,肯定是以t_user表为主表,t_login_log为从表,这里直接贴出sql
查询各个用户最近一次登录时间:
SELECT
t1.id,
t1. NAME,
t2.login_time
FROM
t_user AS t1
LEFT JOIN t_login_log AS t2 ON t1.id = t2.user_id
WHERE
NOT EXISTS (
SELECT
1
FROM
t_login_log AS t3
WHERE
t2.user_id = t3.user_id
AND t2.login_time < t3.login_time
)
查询结果如下:
这个sql其实也非常的简单,最关键的就是WHERE NOT EXISTS的处理,也就是一个子查询,之前写过一篇博客也是类似的场景,可以翻阅一下,这里就不赘述了。
传送门:SQL分组查询最值 https://blog.youkuaiyun.com/cwr452829537/article/details/84376916