Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Top 2 Datensätze pro Gruppe

Ihre Idee liegt nahe. Ich denke, das wird besser funktionieren:

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 ;

Hier sind die Änderungen:

  • Die Variablen werden in nur einem Ausdruck gesetzt. MySQL garantiert nicht die Reihenfolge der Auswertung von Ausdrücken, daher ist dies wichtig.
  • Die Arbeit wird in einer Unterabfrage erledigt, die dann in der äußeren Abfrage verarbeitet wird.
  • Die Unterabfrage verwendet order by , nicht group by .
  • Die äußere Abfrage verwendet where statt having (eigentlich in MySQL having würde funktionieren, aber where ist besser geeignet).