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

MySQL-スコアテーブルでユーザーのランクを選択

    このコンテキストで「問題がある」とはどういう意味かはわかりませんが、これがプレーンなLEFT JOINとして書き直されたクエリです。 最後にランキングを正しく取得するためのサブクエリを使用します(ORDER BY ランキングの前に行う必要があります);

    SELECT user_id, score, @rank := @rank + 1 AS rank FROM
    (
      SELECT u.user_id, u.score
      FROM user_score u
      LEFT JOIN user_score u2
        ON u.user_id=u2.user_id
       AND u.`timestamp` < u2.`timestamp`
      WHERE u2.`timestamp` IS NULL
      ORDER BY u.score DESC
    ) zz, (SELECT @rank := 0) z;
    

    テストするSQLfiddle

    編集:group_idを考慮に入れるには、クエリをいくらか拡張する必要があります;

    SELECT user_id, score, @rank := @rank + 1 AS rank FROM
    (
      SELECT u.user_id, u.score
      FROM user_score u
      LEFT JOIN user_score u2
        ON u.user_id=u2.user_id
       AND u.group_id = u2.group_id       -- u and u2 have the same group
       AND u.`timestamp` < u2.`timestamp`
      WHERE u2.`timestamp` IS NULL
        AND u.group_id = 1                -- ...and that group is group 1
      ORDER BY u.score DESC
    ) zz, (SELECT @rank := 0) z;
    

    別のSQLfiddle



    1. MySQLデータベースのパフォーマンスを提供するためのヒント-パート1-

    2. SQLite-データベースをファイルにバックアップ

    3. SQL Server(T-SQL)でパーティションテーブルをクエリするときに、各行のパーティション番号を返す

    4. SQL Server 2005を使用して、カンマ区切りの値を個別の行に展開するにはどうすればよいですか?