0

現在、次のデータを取得しようとしています。

UserName、UserImageURL、合計ゲーム数、完了したゲーム数、負けたゲーム数、平均勝率 (パーセンテージ)、およびユーザーのポイント

また、別のデータセット:

次のようなユーザー統計データ:

  • リーグでプレイされた最多ゲーム: 23 - モンスター キラーズ
  • 最も多く勝ったゲーム: 19/23 - Monster Killers
  • 最も失われたゲーム: 3/32 - Frog Racers
  • ゲームの勝利精度 (全ゲームの合計) - 68% の精度

サイト統計:

  • リーグでプレイされた最多ゲーム: 650 - ヘリコプター ラン
  • トップ ゲーム: 1200 - モンスター キラーズ
  • サイト全体の当選精度: 82%

次のテーブルがあります。

-ユーザーテーブル-

userID (int-pk)、userName (varchar)、userImageUrl (テキスト)

-ゲームテーブル-

gameId (int-pk)、gameName (varchar)、gameUserID (int)、gameLeagueId (int)、score1 (int)、score2 (int)、gameResultOut (0 または 1)、gameWon (0 または 1)

<ユーザーバランス表>

ubId(int-pk) userId (int) 残高 (int)

-リーグテーブル- LeagueId (int-pk) LeagueName (varchar)

ユーザーがゲームをプレイして結果を選択すると、games テーブルに行が挿入されます。ゲームは時間ベースであるため、結果が出ると、その ID を持つゲームがあるかどうかをチェックし、ユーザーが選択したものに従って gameResultOut を 1 に更新し、gameWon を 1 または 0 に更新します。スコア。

私は次のことを試しました:

SELECT u.userID, u.userName, u.userImageUrl, l.leagueName , 
COUNT(g.gameId) AS predTotal, 
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 1) AS gamesWon,
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 0) AS gamesLost, 
ub.balance 
FROM games AS g
LEFT JOIN league AS l ON l.leagueId = g.gameLeagueId 
LEFT JOIN user AS u ON u.user_id = g.gameUserID 
LEFT JOIN user_balance AS ub ON ub.userId = u.userID 
WHERE l.leagueId = 4
GROUP BY u.userId 
ORDER BY ub.balance DESC

クエリの後で勝率を簡単に計算できるので問題ありませんが、勝敗の結果はすべて同じであり、leageId を変更しても結果は同じです。これは私が望むものではありません。 .

誰でも助けることができますか?

よろしくお願いします、ネクロン

4

1 に答える 1

1

私が見る限り、gamesテーブルにはユーザーがプレイしたゲームが格納されています。したがって、各ユーザーがプレイした/勝った/負けたゲームの数を知るために、 gamesusersの間のサブクエリにリンクがありません。

サブクエリは次のとおりです。

(SELECT COUNT(g.gameId ) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 1) AS gamesWon,
(SELECT COUNT(g.gameId) FROM games AS g WHERE g.gameResultOut = 1 AND g.gameWon = 0) AS gamesLost, 

そして、それらは次のようになります。

(SELECT COUNT(gw.gameId ) FROM games AS gw WHERE gw.gameResultOut = 1 AND gw.gameWon = 1 AND gw.gameUserID = u.user_id) AS gamesWon,
(SELECT COUNT(gl.gameId) FROM games AS gl WHERE gl.gameResultOut = 1 AND gl.gameWon = 0 AND gl.gameUserID = u.user_id) AS gamesLost, 

私はこれがあなたが探しているものだと思います:)


コメントに基づいて編集し、ユーザーとサイトの統計に関するヒントを追加します。

これらの情報については、いくつかの異なるクエリを実行する必要があります。それらのほとんどは、特定の列で値を合計したり、グループ化したりするため、別のクエリには適合しません。私はあなたがそれらに取り組むことができるようにいくつかのアイデアを提供しようとします.

ユーザー統計

ほとんどのゲームの勝敗

あなたが提供したクエリに対する前の回答は、ユーザーがゲームに負けた/勝った回数カウントしますが、ゲーム間でこのデータを区別しません。

したがって、どのゲームのユーザーが最も多くの勝敗を収めているかを知りたい場合は、次のようにする必要があります。

SELECT
    g.gameName,
    -- How many times the user won per game
    (SELECT COUNT(gw.gameId) FROM games gw WHERE gw.gameResultOut = 1 AND gw.gameWon = 1 AND  gw.gameUserID = u.user_id) AS gamesWon,
    -- How many times the user payed each game
    COUNT(g.gameId) AS gamesPlayed,
    -- The Win Ratio. This may need a little work on, depending on what you want.
    -- Be aware that if a user played a game 1 time and won, it's ratio will be 1 (100%)
    -- So maybe you'll want to add your own rule to determine which game should show up here
    (gamesWon / gamesPlayed) AS winRatio
FROM
    games g
    INNER JOIN user u ON u.user_id = g.gameUserID 
-- Groups and counts data based on games + users
GROUP BY g.gameId, u.user_id
-- Now you order by the win ratio
ORDER BY winRatio DESC
-- And get only the first result, which means the game the player has most wins.
LIMIT 1

失われたゲームの場合、必要なフィールドと計算を変更して、ほとんど同じクエリです。

ゲームの勝利精度

gameID でグループ化しないことを除いて、前のクエリと多少異なります。ユーザーごとにグループ化し、計算を行うだけです。

サイト統計

ええと、私が見る限り、私たちはまだ似たような質問をしています。違いは、サイト統計全体について、ユーザーごとにグループ化しないことです。達成しようとしていることに応じて、ゲームまたはリーグごとにグループ化できます。


結論: ほとんどのクエリは似ているように見えます。それらを試して、取得する必要がある各情報に適応させる必要があります。DBでテストできなかったため、十分に機能しない可能性があることに注意してください。データベース/テーブルのスキーマに従って、不整合を修正する必要がある場合があります。

これがあなたに取り組むための洞察を与えることができることを願っています。

于 2013-09-11T14:57:50.533 に答える