2017-08-17 13 views
0

私はシンプルなゲームを作りたいと思っています。のdbごとにlap_timeを入力してください。
しかし、私のクエリは、間違ったplayer_id(2行目3)とtotal_ranks(タイプ別カウントではなくすべてのランク)を返します。 sqlfiddleへこのクエリを正しく動作させることは可能ですか?

リンク:http://sqlfiddle.com/#!9/a0c36a/2

望ましい結果

+--------+-----+-------+------------+----------------+-------------+ 
| level | cp | type | player_id | MIN(lap_time) | total_ranks | 
+--------+-----+-------+------------+----------------+-------------+ 
|  1 | 1 | 0 |   1 |   10.5 |   4 | 
|  1 | 1 | 1 |   2 |   10.45 |   3 | 
+--------+-----+-------+------------+----------------+-------------+ 

は、それは1つのクエリで仕事をしたり、私は少なくとも2が必要に間に合わせることは可能ですか?

+0

であなたが何を意味しますかplayer_id(2行目に3)? – Noob

+1

@NoobはSQLFiddleを参照してください。 OPは実際に関連するコードを出力し、質問自体にも出力する必要がありますが、 – ADyson

答えて

2

Fiddle

同じ概念が、Total_Ranks列

SELECT level, cp, R.type, player_id, MinTime, Total_Ranks 
FROM runtimes R 
JOIN (SELECT TYPE, MIN(LAP_TIME) MinTime, Count(*) Total_Ranks 
     FROM RUNTIMES 
     GROUP BY TYPE) T on R.Type = T.Type 
         and R.lap_time = T.MinTime 
WHERE level=1 
AND cp=1 
2

MySQLでこの問題を解決する標準的な方法の1つは、サブクエリを使用して各タイプの最小ラップタイムを特定することです。その後、フルテーブルをこれに結合して、レコード全体を取得します。このアプローチの優れた副作用は、与えられたタイプに複数の人が最小のラップタイムを共有している場合には、結び付きを取り戻すことです。ここで

SELECT r1.*, r2.total_ranks 
FROM runtimes r1 
INNER JOIN 
(
    SELECT type, MIN(lap_time) AS min_lap_time, COUNT(*) AS total_ranks 
    FROM runtimes 
    GROUP BY type 
) r2 
    ON r1.type  = r2.type AND 
     r1.lap_time = r2.min_lap_time 

は、あなたの更新フィドルへのリンクです:ティムとして

SQLFiddle

+0

いいですが、total_ranksを忘れました。 – exexe

関連する問題