sql >> Databáze >  >> RDS >> Mysql

Uspořádání výsledku MySQL podle hodnoty MAX() jiné tabulky

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

Jiný způsob zápisu, který vypadá logičtěji, ale může být pomalejší (budete muset vyzkoušet), je:

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

S desítkami milionů řádků každý dotaz někdy roste pomalu, ale se správnými indexy je to tak rychlé, jak jen to jde. Myslím, že v podstatě potřebujete jeden index na Paychecks.EmployeeID a Paychecks.AmountPaid dohromady. A index na Employee.ID může pomoci.

Pokud vás spojení nakonec zabije, můžete provést dva dotazy. První používá pouze výplaty k jejich seskupení podle EmployeeID a seřazení podle max(PaycheckAmount) a druhý může být použit k načtení jmen pro každé ID. Někdy spojení stojí více výkonu, než byste chtěli, a když dostanete 10 milionů výplat pro 500 zaměstnanců, může být rychlejší to udělat ve dvou krocích, i když to bude znamenat, že ve společnosti pracují v průměru asi 1600 let. .;-)



  1. Je nějaký rozdíl mezi IS NULL a =NULL

  2. Jak funguje Width_Bucket() v PostgreSQL

  3. datetime to totalminute v sql

  4. Jak nastavit časový limit příkazu pro provedení dotazu