Mysql
 sql >> Database >  >> RDS >> Mysql

Ordinare un set di risultati MySQL in base a un valore MAX() di un'altra tabella

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

Un modo diverso di scrivere, che sembra più logico, ma potrebbe essere più lento (dovresti fare un test) è:

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 decine di milioni di righe, ogni query a volte cresce lentamente, ma con gli indici appropriati, questo è il più veloce possibile. Penso che fondamentalmente tu abbia bisogno di un indice su Paychecks.EmployeeID e Paychecks.AmountPaid combinati. E l'indice su Employee.ID può aiutare.

Se il join alla fine ti sta uccidendo, puoi eseguire due query. Il primo utilizza solo le buste paga per raggrupparle per EmployeeID e ordinarle per max(PaycheckAmount) e un secondo può essere utilizzato per recuperare i nomi per ciascun ID. A volte le join costano più prestazioni di quelle che vorresti e quando hai 10 milioni di buste paga per 500 dipendenti, potrebbe essere più veloce farlo in due passaggi, anche se significherà che lavorano nell'azienda da circa 1600 anni in media .;-)