2013-06-19 51 views
0

假設我有兩個表。使用另一個表的MAX()值排序MySQL結果集

表1:員工名冊

| ID | Name  | 
| ---| ------------| 
| 1 | Joe   | 
| 2 | Jim   | 
| 3 | Jane  | 
| 4 | Jill  | 
| 5 | Dilbert  | 

表2:每月薪水

| Check # | Employee ID | Amount paid | 
|---------|-------------|-------------| 
| 11235 |  3  | 2000  | 
| 51239 |  2  | 3000  | 
| 72244 |  5  | 6500  | 
| 61633 |  2  | 2300  | 
| 14234 |  1  | 2900  | 
| 91335 |  1  | 4500  | 
| 13736 |  4  | 3000  | 
| 41234 |  5  | 5000  | 
| 71232 |  4  | 10000  | 
| 88234 |  2  | 6000  | 
| 23039 |  3  | 1200  | 
| 42534 |  2  | 9000  | 
| 74834 |  3  | 1230  | 
| 38034 |  5  | 9900  | 
| 91334 |  2  | 1280  | 
| 24134 |  1  | 2000  | 

所以基本上我們有5名員工,其跟蹤的多少,我們每月支付他們的表。

我需要做一個查詢,將返回所有員工的BEST PAYCHECK EVER訂購。

就像......吉爾曾經有過10000張工資單,這讓她在結果集上排名第一。迪爾伯特應該是#2,因爲他曾經獲得9900美元的薪水。等

應該足夠快,與數以百萬計的條目

感謝的10S表中前進!

回答

0
select 
    p.ID, 
    e.NAME 
from 
    Paychecks p 
    inner join Employee e on p.EmployeeID = e.ID 
group by 
    p.ID 
order by 
    max(p.AmountPaid) desc 

寫作不同的方式,這看起來更合乎邏輯,但可能會比較慢(你必須進行測試)是:

select 
    e.ID, 
    e.NAME 
from 
    Employee e 
    inner join Paychecks p on p.EmployeeID = e.ID 
group by 
    e.ID 
order by 
    max(p.AmountPaid) desc 

擁有數百萬行的,每個查詢越來越大有時候速度很慢,但有了適當的指標,這個速度就會變得很快。我認爲你基本上需要一個與Paychecks.EmployeeID和Paychecks.AmountPaid結合的索引。 Employee.ID上的索引可能會有所幫助。

如果加入最終會導致您失敗,則可以執行兩個查詢。第一個只使用薪水將其按EmployeeID進行分組,並按最大值(PaycheckAmount)排序,第二個可用於獲取每個ID的名稱。有時候,加入會比你想要的成本更高,而當你爲500名員工提供1000萬工資時,分兩步執行可能會更快,儘管這意味着他們在公司工作了大約1600年的時間。 ;-)

+0

萬分感謝。去嘗試一下。 – Segolene

0

正如Golez所說,有了這麼多的數據,查詢可能會很慢。

也許你應該跟蹤最高薪水,不要每次都問db?

你可以從你的程序,或使用觸發器。取決於你。

在這種情況下,你將有隻有一次執行查詢,填寫表格與初始數據,然後它將會被自動更新

+0

這就是我現在正在做的事情,但我正在尋找一些可以做到的「魔術」MySQL優化代碼。 :) – Segolene

相關問題