0

cn_category.category_pointsすべてのプレーヤー (cn_playersレコード)の合計ポイント ( ) を計算する必要があります。cn_recordsこれは、現在のレコードと廃止されたレコードの両方を含むテーブルによって駆動されます。cn_categoryすべてのカテゴリ (記録 )、マップ (cn_maps記録 ; 以下には表示されていません)、およびゲーム (記録 ; 以下には表示されていません )のベストタイムのみを合計する必要がありcn_wadsます。また、カテゴリー #9、#10、および #11 については、最高点だけでなく、最高3 つのスコア/記録に対してポイントが与えられます。

これまでのところ、次のクエリがありますが、現在のレコードと廃止されたレコードの両方がカウントされます。

SELECT *, MIN(r.record_time), SUM(cn_category.category_points)
FROM (select * from cn_records as r order by r.record_time ASC) AS r
LEFT JOIN cn_players ON r.player1_id = cn_players.player_id
LEFT JOIN cn_category ON r.category_id = cn_category.category_id
WHERE r.category_id BETWEEN 1 AND 25
GROUP BY r.player1_id
ORDER BY SUM(category_points), r.player1_id DESC

(注: 上記は完全なクエリではありません。簡単にするために、いくつかの結合とWHERE-clause 条件が削除されています。)

カテゴリは次のcn_category表にあります。

 category_id | category_points | ...
-------------+-----------------+-----
           1 |             1.0 | ...
           9 |             5.0 | ...
         ... |             ... | ...

プレイヤーはcn_playersテーブルにいます:

 player_id | ...
-----------+-----
         1 | ...
         2 | ...
       ... | ...

「レコード」はcn_recordsテーブルにあります(何千もの行があります):

 record_id | category_id | player1_id | record_time | ...
-----------+-------------+------------+-------------+-----
         1 |           1 |        143 |    00:00:00 | ...
         2 |           1 |        145 |    00:00:00 | ...
         3 |           1 |         41 |    00:00:00 | ...
         4 |           1 |         41 |    00:00:00 | ...
         5 |           1 |        141 |    00:00:00 | ...
         6 |           1 |         41 |    00:00:00 | ...
       ... |         ... |        ... |         ... | ...
4

1 に答える 1

0

このようなもの?cn_records テーブルからカテゴリごとの最大ポイントを選択することから始めます。次に、cn_records テーブルを再度結合して、カテゴリごとの実際のレコード (最大ポイントに一致するもの) のみを選択できます。

その後、プレーヤーとカテゴリの詳細に参加し、必要に応じて追加のグループ化とフィルタリングを行うことができます. 難しい部分は完了です。:)

SELECT
    p.player_id,
    p.player_name,
    sum(c.category_points) AS total_points
FROM
    /* Select the max points per category */
    (SELECT
      r.category_id,
      min(r.record_time) AS best_time
    FROM
      cn_records r
    GROUP BY
      r.category_id) ar /* Actual records */
    /* Join the records table to find the records that match the max points.
       These are the only records to investigate */
    INNER JOIN cn_records r 
      ON r.category_id = ar.category_id 
      AND r.record_time = ar.best_time
    /* Inner (don't left) join player. What is a record without player */
    INNER JOIN cn_players p ON r.player1_id = p.player_id
    INNER JOIN cn_category c ON r.category_id = c.category_id
GROUP BY
    r.category_id
于 2012-09-02T09:53:50.263 に答える