sql >> Database >  >> RDS >> Mysql

Een MySQL-resultaat bestellen dat is ingesteld met een MAX()-waarde van een andere 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

Een andere manier van schrijven, die er logischer uitziet, maar misschien langzamer is (je zou moeten testen), is:

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

Met tientallen miljoenen rijen groeit elke zoekopdracht soms traag, maar met de juiste indexen gaat dit zo snel als maar kan. Ik denk dat je eigenlijk één index nodig hebt op Paychecks.EmployeeID en Paychecks.AmountPaid gecombineerd. En index op Employee.ID kan helpen.

Als de join je uiteindelijk doodt, kun je twee query's uitvoeren. De eerste gebruikt alleen de loonstrookjes om ze te groeperen op EmployeeID en te ordenen op max (PaycheckAmount), en een tweede kan worden gebruikt om de namen voor elke ID op te halen. Soms kost deelname meer prestaties dan je zou willen, en als je 10 miljoen salaris krijgt voor 500 werknemers, is het misschien sneller om het in twee stappen te doen, hoewel het betekent dat ze gemiddeld ongeveer 1600 jaar bij het bedrijf werken .;-)



  1. JSON invoegen in een tabel in SQL Server

  2. Invoegen in een tabel met een streepje in de naam

  3. Fouten in SQL Server tijdens het importeren van CSV-bestand ondanks dat varchar(MAX) voor elke kolom wordt gebruikt

  4. De laatste notitie ophalen (op tijdstempel) in een enkele query uit een 1:n-tabel