[英]MySQL - joining a table to itself / sub queries
我正在尋求有關我最近做錯的評估問題的幫助,我嘗試了多種解決方案並且認為我有點知道我正在嘗試做什么,但似乎無法弄清楚語法。
我有一個看起來像下圖但有更多記錄的表格。
MyTable
ID Name DivisionID ManagerID Salary
123 John Smith 100 789 40000
456 Harold Johnson 101 null 60000
789 Vicky Brown 100 null 80000
並且必須到 select 工資第三高的人的行,我沒有問題。 但是,我還需要返回需要從同一個表中查找的經理名稱,而不是 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 在不同的別名下從同一個表中得到兩個不同的結果,然后將兩者結合起來,但同樣無法弄清楚如何做到這一點。 以下是我嘗試使用別名進行的操作
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;
首先,當被要求返回第 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;
MySQL 從版本 8 開始支持DENSE_RANK
。在舊版本中,您必須再次查找同一張表。 Select 不同的薪水,並在這些銷售額上使用您的限制/抵消條款。
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
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
編號 | 名稱 | 部門編號 | 名稱 | 工資 --: |:-------- | ----------: |:---------- | -----: 123 | 約翰·史密斯 | 100 | 維琪布朗 | 40000
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.