MySQL 使用聚合函數max() 加 group 或子查詢 導致查詢結構錯位的問題

今天做牛客這套題時候,發現查詢出來了第二大的工資,但是對應的人是錯誤的

https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&tqId=29770&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fsql%2Fquestion-ranking&tab=answerKey

題目如下

請你查找薪水排名第二多的員工編號emp_no、薪水salary、last_name以及first_name,不能使用order by完成

建表語句如下

drop table if exists  `employees` ; 
drop table if exists  `salaries` ; 
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`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,74057,'2001-11-27','9999-01-01');

最開始使用如下語句

SELECT
	e1.emp_no,
	max(s1.salary) AS salary,
	e1.last_name,
	e1.first_name
FROM
	employees e1,
	salaries s1
WHERE
	salary NOT IN (
		SELECT
			max(s2.salary) AS maxSalary
		FROM
			employees e2,
			salaries s2
		WHERE
			e2.emp_no = s2.emp_no
	)
AND e1.emp_no = s1.emp_no

顯示如下

最後使用這樣的語句可以過的了mysql

SELECT
	e1.emp_no,
	max(s1.salary) AS salary,
	e1.last_name,
	e1.first_name
FROM
	employees e1,
	salaries s1
WHERE
	salary = (
		SELECT
			MAX(salary)
		FROM
			salaries s3
		WHERE
			s3.salary NOT IN (
				SELECT
					max(s2.salary) AS maxSalary
				FROM
					employees e2,
					salaries s2
				WHERE
					e2.emp_no = s2.emp_no
			)
	)
AND e1.emp_no = s1.emp_no

之後查詢,發現max() 與group by一起使用也有這樣的坑

https://blog.csdn.net/Jessica__sun/article/details/79771263

https://blog.csdn.net/lhy3323101/article/details/86250184

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章