sql >> データベース >  >> RDS >> Mysql

グループあたりのMySQLトップ2レコード

    あなたの考えは近いです。これでうまくいくと思います:

    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 ;
    

    変更点は次のとおりです。

    • 変数は1つの式でのみ設定されます。 MySQLは式の評価の順序を保証しないため、これは重要です。
    • 作業はサブクエリで実行され、サブクエリは外部クエリで処理されます。
    • サブクエリはorder byを使用します 、group byではありません 。
    • 外部クエリはwhereを使用します havingの代わりに (実際には、MySQLではhaving 動作しますが、where より適切です。



    1. MySQLNonTransientConnectionExceptionデータベースサーバーへの接続を作成できませんでした。原因:java.lang.NullPointerException

    2. 接続プール戦略:良い、悪い、または醜い?

    3. PowerShellを使用して.sqlファイルを実行する方法は?

    4. パフォーマンスを向上させるためのクエリの書き換え