-2

こんにちは、トップ 3 のランキングを取得して php に渡そうとしています。2 つの ID の合計スコアが同じであれば、両方とも同じランクになります。私は使用しようとしましlimit 0, 3rank()が、同じ合計スコアを考慮せずに最初の 3 つのレコードしか取得しませんでした。

╔════╦════════════╗
║ ID ║ TOTALSCORE ║
╠════╬════════════╣
║  7 ║         20 ║
║  4 ║         20 ║
║  6 ║         18 ║
║  9 ║         18 ║
║  1 ║         16 ║
╚════╩════════════╝

すると、ランキングは

╔══════╦════╗
║ RANK ║ ID ║
╠══════╬════╣
║    1 ║  7 ║
║    1 ║  4 ║
║    2 ║  6 ║
║    2 ║  9 ║
║    3 ║  1 ║
╚══════╩════╝
4

2 に答える 2

2

MySQLは RDBMS のようにサポートしていないため、ユーザー定義変数を使用してWindow FunctionDENSE_RANK()ができるかをシミュレートできます。

SELECT  a.ID, a.TotalScore, b.Rank
FROM    TableName a
        INNER JOIN
        (
            SELECT  TotalScore, @rn := @rn + 1 Rank
            FROM
                    (
                        SELECT  DISTINCT TotalScore
                        FROM    TableName
                    ) a, (SELECT @rn := 0) b
            ORDER   BY TotalScore DESC
        ) b ON  a.TotalScore = b.TotalScore
WHERE   Rank <= 3

出力

╔════╦════════════╦══════╗
║ ID ║ TOTALSCORE ║ RANK ║
╠════╬════════════╬══════╣
║  7 ║         20 ║    1 ║
║  4 ║         20 ║    1 ║
║  6 ║         18 ║    2 ║
║  9 ║         18 ║    2 ║
║  1 ║         16 ║    3 ║
╚════╩════════════╩══════╝
于 2013-03-30T15:27:40.247 に答える