sql >> Database >  >> RDS >> Mysql

MySQL top 2 records per groep

Uw idee is dichtbij. Ik denk dat dit beter zal werken:

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 ;

Dit zijn de wijzigingen:

  • De variabelen worden in slechts één expressie gezet. MySQL garandeert niet de volgorde van evaluatie van uitdrukkingen, dus dit is belangrijk.
  • Het werk wordt gedaan in een subquery, die vervolgens wordt verwerkt in de buitenste query.
  • De subquery gebruikt order by , niet group by .
  • De buitenste query gebruikt where in plaats van having (eigenlijk, in MySQL having zou werken, maar where is meer geschikt).



  1. Hoe krijg ik een Query Execution Plan in SQL Server?

  2. Servisch Latijnse karakters opslaan in database

  3. sla strings van willekeurige lengte op in Postgresql

  4. Hoe MySQL strikte modus in- of uitschakelen in localhost (xampp)?