需求是:
查询员工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不能排序之后在分组,但是分组之后就已经去重了,再排序有个毛用。
仿佛进入了死胡同。。。。。。
提出解决办法:
我们可以先排序,排序之后把这个结果当成一个临时表,然后再从这个表中查询结果,最后再排序就可以完美解决。