2013-03-20 155 views
0

鑑於此架構:MySQL查詢查找的姓名和年齡最小的員工的年齡在每個部門

Emp(eid: integer,ename: string,age: integer,salary: real) 
Works(eid:integer,did: integer,pct_time: integer) 
Dept(did:integer,budget: real,managerid:integer) 

我想出了這一點:

SELECT w.did, MIN(e.age) AS Youngest 
FROM Works w INNER JOIN Emp e USING (eid) 
GROUP BY w.did 

其中列出了最年輕的年齡每部。但是,我無法弄清楚如何得到每個具有上市年齡的人的姓名。我不能只將這個ename添加到這個查詢中的SELECT列表中,因爲這會返回錯誤的名字。

我剛試過這樣的東西,但它不起作用。

SELECT e2.ename, e2.age, w2.did 
FROM Emp e2 INNER JOIN Works w2 USING (eid), 
    (
    SELECT w.did, MIN(e.age) AS Youngest 
    FROM Works w INNER JOIN Emp e USING (eid) 
    GROUP BY w.did 
    ) MyTable 
WHERE e2.eid = eid AND e2.age = Youngest 

它列出了同一部門的多個人。

回答

0

嘗試:

SELECT e2.ename, e2.age, w2.did 
FROM Emp e2 
JOIN Works w2 USING (eid) 
JOIN (SELECT w.did, MIN(e.age) AS Youngest 
     FROM Works w 
     INNER JOIN Emp e USING (eid) 
     GROUP BY w.did) sq 
    ON w2.did = sq.did and e2.age = sq.Youngest 
0

這應該這樣做。您需要創建一個子查詢有沒有和最低年齡,然後用它來加入到您現有的表emp

SELECT w.did, ename, e.age AS Youngest 
FROM Works w 
    INNER JOIN (SELECT did, MIN(age) minage 
      FROM emp e INNER JOIN works w ON e.eid = w.eid 
      GROUP BY did) ea 
    INNER JOIN Emp e ON w.did = ea.did AND e.age = ea.minage 
+0

我想出了一些與您的返回相同數量的行的東西。不知道什麼是更好的,但。其實這不起作用(不包括兩個拼寫錯誤)。它會爲同一部門返回多個年齡不同的人。 – Watabou 2013-03-20 18:00:20

+0

我更新了我的答案。最後的加入應該是部門而不是員工 – 2013-03-20 18:37:16

0

試試這個從每個故里顯示最年輕的emplyee :

select p.Nativeplace, p.Name, p.Dobirth from personal p having p.Dobirth=(select max(Dobirth) from personal p2 where p.Nativeplace=p2.Nativeplace group by p2.Nativeplace);