通过另一个表的MAX()值对MySQL结果集进行排序

时间:2013-06-19 14:03:44

标签: mysql select

假设我有两张桌子。

表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名员工和一张表,记录我们每月支付的费用。

我需要提出一个查询,以便返回所有按照最佳PAYCHECK EVER订购的员工。

就像......吉尔曾经有过10000薪水,这使得她在结果集上排名第一。迪尔伯特应该是#2,因为他曾经拿到9900薪水。等

对于包含数百万条目的表格,它应该足够快

提前致谢!

2 个答案:

答案 0 :(得分:1)

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上的索引可能有所帮助。

如果联接最终会杀死你,你可以执行两个查询。第一个只使用paychecks按EmployeeID对它们进行分组,并按max(PaycheckAmount)对它们进行排序,第二个可以用来获取每个ID的名称。有时加入的成本比你想要的要多,当你为500名员工拿到1000万美元的薪水时,分两步完成它可能会更快,尽管这意味着他们已经在公司工作了1600年左右。 ; - )

答案 1 :(得分:0)

正如Golez所说,有了这么多数据,查询可能会很慢。

也许你应该跟踪最高薪水,而不是每次都询问db?

您可以通过程序或使用触发器执行此操作。取决于你。

在这种情况下,您只需要执行一次查询,用初始数据填充表格,然后它将自动更新