sql >> Base de Datos >  >> RDS >> Mysql

Ordenar un conjunto de resultados de MySQL por un valor MAX () de otra tabla

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

Una forma diferente de escribir, que parece más lógica, pero puede ser más lenta (tendrías que probarla) es:

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

Con decenas de millones de filas, cada consulta crece lentamente a veces, pero con los índices adecuados, esto es lo más rápido posible. Creo que básicamente necesita un índice en Paychecks.EmployeeID y Paychecks.AmountPaid combinados. Y el índice en Employee.ID puede ayudar.

Si la combinación lo está matando al final, puede ejecutar dos consultas. El primero solo usa los cheques de pago para agruparlos por EmployeeID y ordenarlos por el máximo (PaycheckAmount), y el segundo se puede usar para obtener los nombres de cada ID. A veces, las uniones cuestan más rendimiento de lo que le gustaría, y cuando obtuvo 10 millones de cheques de pago para 500 empleados, puede ser más rápido hacerlo en dos pasos, aunque significará que han estado trabajando en la empresa durante aproximadamente 1600 años en promedio. .;-)