2

ゲームサーバーでランキングシステムを実現するために、各プレーヤーに関する情報をMySQLデータベースに保存します。次のデータベーステーブルがあります。

サンプルデータを含む表players

id | steamId | deaths
---+---------+-------
1  | asdja   | 2
2  | kfjsl   | 5

サンプルデータを含む表weapons

playerId | weaponId | kills
---------+----------+------
1        | 5        | 8
1        | 9        | 7
2        | 3        | 3
2        | 6        | 10
2        | 7        | 2

players-tableから簡単に計算できるため、各プレイヤーのキルを-tableに保存していないことがわかりますweapons。私はSQLクエリにあまり詳しくありませんが、次のフィールドを持つ単純なデータセットを選択するために次のクエリの作成を完了しました。

kills,
deaths,
kill-death-rate (kdrate),
count (maximum number of players),
rank (current ranking position, sorted by kills)

クエリ:

SELECT
    SUM(weapons.kills) AS `kills`,
    `deaths`,
    (SUM(kills) / IF(deaths, deaths, 1)) AS `kdrate`,
    (SELECT COUNT(*) FROM `players`) AS `count`,
    (
        SELECT
            COUNT(*)
        FROM
            (
                SELECT
                    p.id AS id2,
                    SUM(w.kills) AS kills2,
                    p.deaths AS deaths2,
                    p.steamId AS steamId2
                FROM
                    weapons AS w,
                    players AS p
                WHERE
                    p.id = w.playerId
                GROUP BY
                    p.id
            ) AS temp
        WHERE
            temp.kills2 >= (
                SELECT
                    SUM(weapons.kills) AS `kills`
                FROM
                    `players`,
                    `weapons`
                WHERE
                    players.id = weapons.playerId AND
                    `id` = 1
                GROUP BY
                  `id`
            )
        ORDER BY
            temp.kills2 DESC,
            temp.deaths2 ASC,
            temp.steamId2 ASC
    ) AS `rank`
FROM
    `players`
INNER JOIN
    `weapons`
ON
    players.id = weapons.playerId
WHERE
    `id` = 1
GROUP BY
    `id`

2つの問題があります:

1.)クエリはひどいです。

2.)指定されたサンプルデータを使用してこのクエリを実行すると、「同じランク」になります。つまり、キルの量は両方のプレイヤーで同じなので、両方のプレイヤーが同じランクになります。しかし、代わりに、プレイヤー1はプレイヤー2よりも死亡数が少ないため、ランク1になっているはずです。これをどのように実現できるかわかりません。

前もって感謝します!

編集:@Manueru_mxは私にそれを行う方法の基本的な考えを与えました:私は彼の答えに基づいて次のコードを持っています:

SELECT
    id,
    kills,
    deaths,
    kdrate,
    COUNT(*) AS rank,
    (SELECT COUNT(*) FROM players) AS `count`
FROM
    (
        SELECT
            pys.id AS id,
            SUM(wps.kills) AS kills,
            pys.deaths AS deaths,
            (SUM(wps.kills) / pys.deaths) as kdrate
        FROM
            players pys
        INNER JOIN
            weapons wps
        ON
            pys.id = wps.playerid
        GROUP BY
            pys.id
        ORDER BY
            2 DESC,
            3,
            4 ASC
    ) AS tmp
WHERE
    id = 1

残っている唯一の問題は、rankどちらの場合もが1であるということです。

4

3 に答える 3

2

これが私の「解決策」です。このクエリはより単純ですが、探している結果を取得します

select 
pys.steamID, SUM(wps.kills) as Kills,
SUM(pys.deaths) as Deaths,
(sum(wps.kills)/sum(pys.deaths)) as kdratio
--,COUNT(pys.steamID) as PlayersC
from players pys
inner join  weapons wps on pys.id = wps.playerid
group by pys.steamID
order by 2 DESC, 3, 4 ASC

ランクを追加します。

SELECT
    id,
    kills,
    deaths,
    kdrate,
    ranking_usr as rank,
    (SELECT COUNT(*) FROM players) AS `count`
FROM
    (
        SELECT
            @row := @row + 1 AS ranking_usr
            pys.id AS id,
            SUM(wps.kills) AS kills,
            pys.deaths AS deaths,
            (SUM(wps.kills) / pys.deaths) as kdrate
        FROM
            players pys
        INNER JOIN
            weapons wps
        ON
            pys.id = wps.playerid
        GROUP BY
            pys.id
        ORDER BY
            2 DESC,
            3,
            4 ASC
    ) AS tmp
WHERE
    id = 1
于 2012-10-19T14:38:14.320 に答える
2

Manueru_mxの回答に基づいて、解決策は次のとおりです。

SELECT
    *
FROM
    (
    SELECT
        id,
        kills,
        deaths,
        kdrate,
        @rownum := @rownum + 1 AS rank,
        (SELECT COUNT(*) FROM players) AS `count`
    FROM
        (
            SELECT
                pys.id AS id,
                SUM(wps.kills) AS kills,
                pys.deaths AS deaths,
                (SUM(wps.kills) / pys.deaths) as kdrate
            FROM
                players pys
            INNER JOIN
                weapons wps
            ON
                pys.id = wps.playerid
            GROUP BY
                pys.id
            ORDER BY
                2 DESC,
                3,
                4 ASC
        ) AS tmp,
        (SELECT @rownum:= 0) r
    ) AS tmp2
WHERE
    id = 1
于 2012-10-19T15:19:31.293 に答える
0

あなたが期待している結果は何ですか?実行することで、プレイしたキルの数を簡単に知ることができます。

select id, (select sum (kills) from weapons where playerid = p.id)
from  players p
于 2012-10-19T14:24:02.963 に答える