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

Bestilling af et MySQL-resultat angivet med en MAX()-værdi i en anden tabel

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

En anden måde at skrive på, som ser mere logisk ud, men som måske er langsommere (du bliver nødt til at teste), er:

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

Med titusindvis af millioner rækker vokser hver forespørgsel nogle gange langsomt, men med de rigtige indekser er dette så hurtigt, som det bliver. Jeg tror, ​​at du grundlæggende har brug for ét indeks på Paychecks.EmployeeID og Paychecks.AmountPaid kombineret. Og indeks på Employee.ID kan hjælpe.

Hvis joinforbindelsen dræber dig i sidste ende, kan du udføre to forespørgsler. Den første bruger kun lønsedlerne til at gruppere dem efter EmployeeID og bestille dem efter max (PaycheckAmount), og en anden kan bruges til at hente navnene for hvert ID. Nogle gange koster tilslutninger mere ydeevne, end du ønsker, og når du fik 10 millioner lønsedler til 500 ansatte, kan det være hurtigere at gøre det i to trin, selvom det vil betyde, at de har arbejdet i virksomheden i gennemsnitligt omkring 1600 år .;-)



  1. Migrering af data ved hjælp af Network_link

  2. SQL WHERE-erklæring

  3. kald til en medlemsfunktion execute() på et ikke-objekt

  4. Kompleks Postgres-forespørgsel