如何在一对多查询时选取时间最近的一条记录

需求是:

       查询员工id,部门名称,入职时间,部门编号,部门名称,如果在一个部门中查到同一个员工有两条入职记录,显示最近的一条。

1.前提准备,建立两张表,部门表和员工表

CREATE TABLE `dept` (
  `deptId` int(11) NOT NULL,
  `deptNum` int(11) DEFAULT NULL,
  `deptName` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`deptId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



CREATE TABLE `emp` (
  `empId` int(11) NOT NULL,
  `empName` varchar(255) DEFAULT NULL,
  `empCreateTime` date DEFAULT NULL,
  `deptNum` int(11) DEFAULT NULL,
  PRIMARY KEY (`empId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `dept` VALUES (1, 10, '开发部');
INSERT INTO `dept` VALUES (2, 20, '测试部');
INSERT INTO `dept` VALUES (3, 30, '财务部');

INSERT INTO `emp` VALUES (1, '张晓华', '2019-4-2', 10);
INSERT INTO `emp` VALUES (2, '张晓华', '2019-4-13',10);
INSERT INTO `emp` VALUES (3, '王大锤', '2019-3-1', 20);
INSERT INTO `emp` VALUES (4, '王大锤', '2019-4-5', 20);
INSERT INTO `emp` VALUES (5, '王霸丹', '2019-2-1', 30);
INSERT INTO `emp` VALUES (6, '王霸丹', '2019-2-21',30);

2.首先先关联查一下看看 结果

SELECT
	A.empId,
	A.empName,
	A.empCreateTime,
	A.deptNum,
	B.deptId,
	B.deptName
FROM emp A
INNER join dept B
ON A.deptNum =  B.deptNum

从结果中可以看出部门与员工的一对多关系,我们先来试一下按照部门号分组

SELECT
	A.empId,
	A.empName,
	A.empCreateTime,
	A.deptNum,
	B.deptName
FROM emp A
INNER join dept B
ON A.deptNum =  B.deptNum
GROUP BY A.deptNum

和上次结果对比一下

       发现虽然,虽然按照deptNum分了三个组,但是 比较悲催的是,分组后默认选取的是每个组中的第一条数据。而默认查询结果又是按照升序排列的,所以他选取的时间值是最小值,但离我们最近的日期值应该是最大值,所以结果并不符合我们的要求。

       那么增么办才能让分组后第一条数据是时间的最大值呢?

      给出解决思路:先关联查询,然后按时间降序排列,这样我们可以得到一张表

太好了 ,再按照deptNum分组第一条数据就是我们想要的数据了

额。。。。。。报错了,mysql不能排序之后在分组,但是分组之后就已经去重了,再排序有个毛用。

仿佛进入了死胡同。。。。。。

提出解决办法:

     我们可以先排序,排序之后把这个结果当成一个临时表,然后再从这个表中查询结果,最后再排序就可以完美解决。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值