sql >> Databasteknik >  >> RDS >> Mysql

MySQL topp 2 rekord per grupp

Din idé är nära. Jag tror att det här kommer att fungera bättre:

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 ;

Här är ändringarna:

  • Variablerna ställs in i endast ett uttryck. MySQL garanterar inte ordningen för utvärdering av uttryck, så detta är viktigt.
  • Arbetet görs i en underfråga, som sedan bearbetas i den yttre frågan.
  • Underfrågan använder order by , inte group by .
  • Den yttre frågan använder where istället för att having (faktiskt, i MySQL having skulle fungera, men where är mer lämpligt).



  1. Hur man konverterar en sträng till ett numeriskt värde i PostgreSQL

  2. Hur infogar jag korrekt flera rader i PG med nod-postgres?

  3. Är det säkert att lagra användarnamn och lösenord i databasen?

  4. Var är skillnaderna med XML och MySQL-databas? Vilken ska jag använda?