sql >> Databasteknik >  >> RDS >> Mysql

Beställa ett MySQL-resultat satt med ett MAX()-värde i en annan tabell

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

Ett annat sätt att skriva, som ser mer logiskt ut, men som kan vara långsammare (du måste testa) är:

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 tiotals miljoner rader växer varje fråga långsamt ibland, men med rätt index går det så snabbt som möjligt. Jag tror att du i princip behöver ett index på Paychecks.EmployeeID och Paychecks.AmountPaid tillsammans. Och index på Employee.ID kan hjälpa.

Om joinen dödar dig i slutändan kan du köra två frågor. Den första använder bara lönecheckarna för att gruppera dem efter EmployeeID och beställa dem efter max(PaycheckAmount), och en andra kan användas för att hämta namnen för varje ID. Ibland kostar anslutningar mer prestation än du skulle vilja, och när du fick 10 miljoner lönecheckar för 500 anställda kan det gå snabbare att göra det i två steg, även om det kommer att innebära att de har arbetat på företaget i i genomsnitt cirka 1600 år .;-)



  1. Lösning för att inte kunna utföra en DML-operation i en fråga?

  2. Det går inte att starta mysql-servern i ubuntu

  3. Hur man importerar STORA sql-filer till mysql-tabellen

  4. MySQL UPPDATERING syntax med flera tabeller med hjälp av WHERE-sats