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

MySQL top 2 rekorder per gruppe

Din idé er tæt på. Jeg tror, ​​det vil fungere bedre:

select u.*
from (select user_id, created_datetime, 
             $num := if(@user_id = user_id, @num + 1,
                        if(@user_id := id, 1, 1)
                       ) as row_number
      from logs cross join
           (select @user_id := 0, @num := 0) params
      order by user_id 
     ) u
where row_number <= 2 ;

Her er ændringerne:

  • Variablerne er kun sat i ét udtryk. MySQL garanterer ikke rækkefølgen af ​​evaluering af udtryk, så dette er vigtigt.
  • Arbejdet udføres i en underforespørgsel, som derefter behandles i den ydre forespørgsel.
  • Underforespørgslen bruger order by , ikke group by .
  • Den ydre forespørgsel bruger where i stedet for at having (faktisk i MySQL having ville virke, men where er mere passende).



  1. Beregn alder i MySQL (InnoDb)

  2. Skjult ydeevne og håndteringsforbedringer i SQL Server 2012/2014

  3. PHP/SQL-database, der forespørger om god praksis og sikkerhed

  4. NYHEDER:Ny Microsoft SQL Server Native Client 18 udgivet!