ゲームサーバーでランキングシステムを実現するために、各プレーヤーに関する情報を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であるということです。