簡體   English   中英

MySQL - 將表連接到自身/子查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM