我正在就我最近出錯的一個評估問題尋求幫助,我嘗試了許多解決方案,并認為我知道我在嘗試做什么,但似乎無法弄清楚語法。
我有一個如下所示的表格,但有更多記錄。
MyTable
ID Name DivisionID ManagerID Salary
123 John Smith 100 789 40000
456 Harold Johnson 101 null 60000
789 Vicky Brown 100 null 80000
并且必須選擇薪水第三高的人的行,我沒有問題。但是,我還需要回傳需要從同一個表中查找的 Manager Name,而不是 ManagerID。
我嘗試了以下解決方案,它似乎有點不雅,并且必須在其中硬編碼相同的查詢,因此不適合縮放或一般使用:
SELECT
table.ID,
Name,
DivisionID,
(SELECT
Name FROM table WHERE id=(
SELECT ManagerID FROM table ORDER BY Salary DESC LIMIT 2,1)
) AS ManagerName,
Salary
FROM table
ORDER BY Salary DESC LIMIT 2,1;
我認為可能有一些方法可以用子查詢來做到這一點,例如,首先在查詢中選擇一個單獨的表,其中只有經理 ID 和名稱,然后從中選擇 - 但我似乎無法正確使用語法或得到我的繞過它。我認為表別名也可能是可能的,我從同一個表中以不同的別名選擇兩個不同的結果,然后將兩者連接起來,但再次無法弄清楚如何做到這一點。以下是我嘗試使用別名做的事情
SELECT
a.ID,
a.Name,
a.DivisionID,
b.Name AS ManagerName
a.Salary
FROM table a
INNER JOIN table b ON a.ManagerID=b.ID
ORDER BY Salary DESC LIMIT 2,1;
uj5u.com熱心網友回復:
首先,當被要求回傳第 n 個最大值/最小值時,您必須詢問在出現平局時該怎么做。他們想要薪水第三高的人,所以薪水 1000、1000、900、900、800、800、700、600、500,我想你想退回那些收入 800 的人,因為那是第三高的薪水。如果你只是按薪水排序,跳過兩個,取第三個,那你就隨便挑一個薪水900的人,900甚至不是第三高,而是第二高的薪水。
為了得到經理,只需再次加入表。對于薪水第三高的員工自己是經理的情況,您應該使用外部聯接。
直接的解決方案是使用 對行進行排名DENSE_RANK:
select *
from
(
select t.*, dense_rank() over (order by salary desc) as rnk
from mytable t
) employee
left join mytable manager on manager.id = employee.managerid
where employee.rnk = 3;
MySQLDENSE_RANK從版本 8 開始支持。在舊版本中,您必須再次查找同一個表。選擇不同的工資并在這些銷售上使用您的限制/抵消條款。
select *
from mytable employee
left join mytable manager on manager.id = employee.managerid
where employee.salary =
(
select distinct salary
from mytable
order by salary desc
limit 2, 1
);
演示:https ://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=6b17e369fcd4f99ddc6c268de15f08a1
uj5u.com熱心網友回復:
Maka 一??個子查詢表單,您為 thrd 編碼并加入 selj 加入表
這也適用于 MySQL 5.7 及更早版本
CREATE TABLE MyTable ( `ID` INTEGER, `Name` VARCHAR(14), `DivisionID` INTEGER, `ManagerID` VARCHAR(4), `Salary` INTEGER ); INSERT INTO MyTable (`ID`, `Name`, `DivisionID`, `ManagerID`, `Salary`) VALUES ('123', 'John Smith', '100', '789', '40000'), ('456', 'Harold Johnson', '101', 'null', '60000'), ('789', 'Vicky Brown', '100', 'null', '80000');
SELECT m1.ID, m1.Name, m1. DivisionID,m2. Name, m1.Salary FROM (SELECT `ID`, `Name`, `DivisionID`, `ManagerID`, `Salary` FROM MyTable ORDER BY Salary DESC LIMIT 2,1) m1 JOIN MyTable m2 on m1.ManagerID = m2.ID身份證 | 姓名 | 部門ID | 姓名 | 薪水 --: | :--------- | ---------: | :------------ | -----: 123 | 約翰·史密斯 | 100 | 維姬布朗 | 40000
db<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/442197.html
