0

ユーザーのゲームのスコアランクを見つけるためのクエリを作成しようとしています。ユーザーIDを取得して、そのユーザーの相対ランキングを他のユーザーのスコアに戻すために必要です。ユーザーとゲームテーブルがあります。ゲームテーブルには、1対多の関係を持つuserIdフィールドがあります。

サンプルテーブル:

ユーザー:
id freebee
1 10
2 13

ゲーム:
userIdスコア
1 15
1 20
2 10
1 15

$ id 1をこの関数に渡すと、値1が返されます。これは、ユーザー1が現在最高のスコアを持っているためです。同様に、ユーザー2は2を返します。

現在、これは私が持っているものです:

SELECT outerU.id, (

SELECT COUNT( * )  
FROM users userI, games gameI  
WHERE userI.id = gameI.userId  
AND userO.id = gameO.userId  
AND (  
   userI.freebee + SUM(gameI.score)  
   ) >= ( userO.freebee + SUM(gameO.score) )  
) AS rank  
FROM users userO,  
games gameO  
WHERE id = $id

これにより、「グループ関数の無効な使用」エラーが発生します。何か案は?

4

5 に答える 5

1
SELECT u.id,total_score,
 ( SELECT COUNT(*) FROM
    (SELECT u1.id, (IFNULL(u1.freebee,0)+ IFNULL(SUM(score),0)) as total_score
     FROM users u1
     LEFT JOIN games g ON (g.userId = u1.id)
     GROUP BY u1.id
    )x1
   WHERE x1.total_score > x.total_score
 )+1 as rank,

( SELECT COUNT(DISTINCT total_score) FROM
    (SELECT u1.id, (IFNULL(u1.freebee,0)+ IFNULL(SUM(score),0)) as total_score
     FROM users u1
     LEFT JOIN games g ON (g.userId_Id = u1.id)
     GROUP BY u1.id
    )x1
   WHERE x1.total_score > x.total_score
 )+1 as dns_rank

 FROM users u

 LEFT JOIN
  ( SELECT u1.id, (IFNULL(u1.freebee,0)+ IFNULL(SUM(score),0)) as total_score
    FROM users u1
    LEFT JOIN games g ON (g.userId = u1.id)
    GROUP BY u1.id
  )x ON (x.id = u.id)

rank-(通常のランク-例:-1,2,2,4,5)、dns_rank-密なランク(1,2,2,3,4)。列total_score-デバッグ用...

于 2010-06-24T16:07:46.580 に答える
1

SUM(gameO.score)クエリは、相関サブクエリのSum関数の外部テーブルの参照を好みません。次に、結合にコンマ形式を使用するのをやめます。代わりに、JOINのANSI構文を使用してください。たとえば、外部クエリで、本当にクロス結合を使用するつもりでしたか?それがあなたが書いた方法であり、私が以下の解決策でそれを表現した方法ですが、それがあなたが望むものであるとは思えません。

編集

あなたの新しい情報を踏まえて、クエリを調整しました。

Select U.id, U.freebee, GameRanks.Score, GameRanks.Rank
From users As U
    Join    (
            Select G.userid, G.score
                , (
                    Select Count(*)
                    From Games As G2
                    Where G2.userid = G.userid
                        And G2.Score > G.Score
                    ) + 1 As Rank
            From Games As G
            ) As GameRanks
        On GameRanks.userid = U.id
Where U.id =1
于 2010-06-24T15:28:02.123 に答える
0

私はMySQLの人間ではありませんが、MySQLでランク付けを行う通常の方法は、SQLステートメント内で変数を使用することだと思います。以下のようなもの(テストされていない):

SELECT
    SQ.user_id,
    @rank:=@rank + 1 AS rank
FROM
(
    SELECT
        U.user_id,
        U.freebee + SUM(COALESCE(G.score, 0)) AS total_score
    FROM
        Users U
    LEFT OUTER JOIN Games G ON
        G.user_id = U.user_id
) SQ
ORDER BY
    SQ.total_score DESC

これをサブクエリとして使用して、単一ユーザーのランクを取得できますが、パフォーマンスの面では、これは最適なルートではない可能性があります。

于 2010-06-24T15:26:12.930 に答える
0

これは、「ゲーム」テーブルのみに基づいてランクを計算するための「簡略化された」バージョンです。特定のゲームのランクを計算するには、結合を追加する必要があります。

SELECT COUNT(*) + 1 AS rank
FROM   (SELECT userid,
               SUM(score) AS total
        FROM   games
        GROUP  BY userid
        ORDER  BY total DESC) AS gamescore
WHERE  gamescore.total > (SELECT SUM(score)
                          FROM   games
                          WHERE  userid = 1)  

ranking== number of players with bigger score+1という考えに基づいています

于 2010-06-24T15:47:07.137 に答える
0

これをチェックしてください:http: //rpbouman.blogspot.com/2009/09/mysql-another-ranking-trick.html

于 2010-10-21T01:52:25.727 に答える