2017-05-08 8 views
-1

クエリを説明しましょう。これは、各プレイヤーの最高5つのスコアを合計し、これらのスコアのランク付けよりも作成します。最初のクエリは機能しますが、プレイヤーテーブルを追加してプレイヤーのフルネームを追加すると、合計をスクランブルし、プレイヤーごとの合計が正しくありません。テーブルがクエリオーダースクランブルに参加するとき

このクエリは、プレイヤーごとの良い総得点与える:

SET @score_rank := 0; 
SET @current_player = ''; 
SET @topN = 5; 
Select ATLEET_ID as ID, SUM(SCORE) as SUMSUM 
    From (Select r.ATLEET_ID, r.SCORE, k.SEASON, k.TYPE, 
    @score_rank := IF(@current_player = r.ATLEET_ID, (@score_rank + 1), 1) AS score_rank, 
    @current_player := r.ATLEET_ID 
    From RESULTATEN r LEFT JOIN KALENDER k ON (r.KALENDER_ID = k.KALENDER_ID) 
    Where k.TYPE = 'Cup' AND k.SEASON = '2016-2017' 
    Order By r.ATLEET_ID, r.SCORE DESC) sorted 
Where score_rank <= @topN 
Group By ID; 

をしかし、この1つはプレイヤーごとに間違った合計を与える:

SET @score_rank := 0; 
SET @current_player = ''; 
SET @topN = 5; 
Select ATLEET_ID as ID, SUM(SCORE) as SUMSUM 
    From (Select r.ATLEET_ID, r.SCORE, k.SEASON, k.TYPE, 
    @score_rank := IF(@current_player = r.ATLEET_ID, (@score_rank + 1), 1) AS score_rank, 
    @current_player := r.ATLEET_ID 
    From RESULTATEN r LEFT JOIN KALENDER k ON (r.KALENDER_ID = k.KALENDER_ID) JOIN PLAYERS s ON (r.ATLEET_ID = s.PLAYER_ID) 
    Where k.TYPE = 'Cup' AND k.SEASON = '2016-2017' 
    Order By r.ATLEET_ID, r.SCORE DESC) sorted 
Where score_rank <= @topN 
Group By ID; 

(PLAYERSテーブルに参加しました)私は何を理解していません誤算の原因となっているのはなぜですか?私は私の作品のクエリを考え出したコメントで見つかっ助けを借りて

+3

結果を特定の順序にする場合は、最も外側の 'SELECT'に' ORDER BY'を含める必要があります。期間。 –

+0

LEFT JOINは通常のINNER JOINと同じように実行されます。右のテーブル条件をWHEREからONに移動して、真のLEFT JOIN結果を取得します。 – jarlh

答えて

0

SET @score_rank := 0; 
SET @current_player = ''; 
SET @topN = 5; 
Select ATLEET_ID as ID, SUM(SCORE) as SUMSUM 
From (Select r.ATLEET_ID, r.SCORE, k.SEASON, k.TYPE, @score_rank := IF(@current_player = r.ATLEET_ID, (@score_rank + 1), 1) AS score_rank, @current_player := r.ATLEET_ID 
    From RESULTATEN r 
    Inner join KALENDER k on (r.KALENDER_ID = k.KALENDER_ID) and SEIZOEN = '2016-2017' and WEDSTRIJDTYPE = 'Dutch Cup snowboard' 
    Order By r.ATLEET_ID, r.SCORE DESC) sorted 
Left join PLAYERS on (sorted.ATLEET_ID = s.PLAYER_ID) 
Where score_rank <= @topN 
Group by ID; 
ORDER BY SUMSUM DESC LIMIT 0, 2000; 

私は内側のSELECTから外側の選択にPLAYERS表との結合に移動。そして、右側のテーブル条件をWHEREからONに移動しました。

関連する問題