2015-11-15 106 views
0

我有一張如下給出的員工表和說明表。選擇MySQL中varchar的最大值

Employee表:

empId empName 
================ 
1  foo 
2  bar 

說明表:

id description empId 
====================== 
1 test A  1 
2 test B  1 
3 test C  1 
4 test D  2 
5 test E  2 
6 test F  1 

我可以加入和使用的東西查詢作爲獲取每個員工的最新說明,

select e.empId, e.empName, d.description 
from employee e 
inner join description d on d.id=(select max(id) from description where empId=e.empId) 

將返回所需的結果

empId  empName description 
=================================== 
1   foo  test F 
2   bar  test E 

但我想知道是否有任何其他方式來獲得相同的結果,而不子查詢。

+0

按照手冊中的一章,你可以* *做到這一點沒有一個子查詢,但一個不受限制的子查詢解決方案几乎肯定會更快 – Strawberry

回答

0

涉及GROUP BY的解決方案可以完成,但它涉及將原始查詢包裝在另一個選擇中。它避免了查詢選擇最大ID。可以使用這個地方涉及到一個臨時表,並可能是一個文件排序主鍵進行

SELECT * FROM (
SELECT e.empId, e.empName, d.description 
FROM employee e 
JOIN description d USING (empId) 
ORDER BY e.empId ASC, d.id DESC 
) tmp GROUP BY empId 

你原來的查詢,因此它可能不會像高性能。

+0

這是一個無證的解決方案,如果你喜歡,就是'黑客'。但是,嘿,黑客可以很有趣。 – Strawberry

0

我不認爲你可以做到這一點沒有子查詢,但是你可以重寫爲:

select e.empId, 
     e.empName, 
     (select description from description 
     where empId = e.empId 
     order by id desc limit 1) as description 
from employee e 
+0

是的..但有超過五個表要合併,所以我猜連接查詢更好的性能更高 – mpsbhat

+1

在你的問題你有2個表。我怎麼能知道大約5張桌子。您應該運行這兩個查詢並查看哪個更好。沒有人會告訴你不考慮你測量兩個。 –

0
SELECT DISTINCT e.empId, e.empName, d.description 
FROM employee e 
JOIN description d USING (empId) 
join (
    SELECT MAX(d.id) as id 
    FROM description d 
    GROUP BY d.empId 
) AS maxd ON maxd.id = d.id