题解 | #查找入职员工时间排名倒数第三的员工所有信息#
有一个员工employees表简况如下:
建表语句如下:
CREATE TABLE employees
(emp_no
int(11) NOT NULL,birth_date
date NOT NULL,first_name
varchar(14) NOT NULL,last_name
varchar(16) NOT NULL,gender
char(1) NOT NULL,hire_date
date NOT NULL,
PRIMARY KEY (emp_no
));
请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:
SELECT *
FROM employees
ORDER BY hire_date DESC LIMIT 1 OFFSET 2;
但是上面的有一点不好就是,如果说有多个员工最晚的同一天入的职,那么倒数第三位就不一定是答案了,所以要去重。
SELECT *
FROM employees
WHERE hire_date = (
SELECT DISTINCT hire_date
FROM employees
ORDER BY hire_date DESC LIMIT 1 OFFSET 2.
);
select *
from employees
WHERE hire_date = (
select DISTINCT hire_date
from employees
ORDER BY hire_date DESC
LIMIT 2,1
);
select *
from employees
WHERE hire_date = (
select hire_date
from employees
GROUP BY hire_date
ORDER BY hire_date DESC
LIMIT 2,1
);
group by 和distinct 都能够去重。
补充知识点,关于LIMIT ,OFFSET 的使用:select* from test LIMIT 3;
当 limit后面跟一个参数的时候,该参数表示要取的数据的数量。 表示直接取前三条数据,类似sqlserver里的top语法。
以下的两种方式均表示取2,3,4三条数据。
1.select* from test LIMIT 1,3;
当limit后面跟两个参数的时候,第一个数表示要跳过的数量,后一位表示要取的数量。
2.select * from test LIMIT 3 OFFSET 1;(在mysql 5以后支持这种写法)
当 limit和offset组合使用的时候,limit后面只能有一个参数,表示要取的的数量,offset表示要跳过的数量 。