2017-10-07 13 views
3

以下のSQLに関するこの質問を参考にして、各チームのトップ5レングスを合計しました。私にとって今の問題は、SQLは無作為に5つのデータベース(例えば25行目、5行目は5行目)をランダムに選択しているようです。多くのappriciatedだろう!SQL各チームの上位5行を合計します

select team, sum(length) as totalScore 
from 
(
    SELECT 
     t.*, 
     @num_in_group:=case when @team!=team then @num_in_group:=0 else @num_in_group:[email protected]_in_group+1 end as num_in_group, 
     @team:=team as t 
    FROM reg_catches t, (select @team:=-1, @num_in_group:=0) init 
    ORDER BY team asc 
) sub 
WHERE 
    sub.num_in_group <= 4 and 
    competition = 16 and 
    team = 25 
GROUP BY team 
ORDER BY totalScore DESC; 

team length competition 
---------------------- 
26 70  16 
25 70  16 
25 95  16 
25 98  16 
25 100  16 
25 100  16 
25 100  16 
25 122  16 

募集出力:

team totalScore 
---- ----------- 
25 520 
26 70 

敬具、あなたの内側のクエリで クリスチャン

+0

表の主キーはありませんか? –

+0

@PaulSpiegel私たちがすでに持っているデータの上にプライマリキーがなぜ役立つのでしょうか? –

+0

@TimBiegeleisenあなたはあなた自身の答えでそれを書いた: "ネクタイを壊すために他の列"。 –

答えて

1

として別の順序句を追加

DEMO

これは最初のチームとのテーブルの行を注文し、チームのために高い値が第一

または取得するための別の方法で返送されますので、その後、各チームのためには、長さが列の値で行を注文します使用して変数

select a.team, sum(a.length) as totalScore 
from (
select b.*,(
    select count(*) 
    from reg_catches c 
    where b.team = c.team 
    and b.length < c.length 
    ) + 1 rownum 
from reg_catches b 
) a 
where a.rownum <=5 
group by a.team 
order by totalScore DESC; 

DEMO

なくても同じ結果

がより良いパフォーマンスを得るためにチームと長列に索引を持っていることを確認してください

1

、あなたの現在のクエリを持っている任意の論理的な問題に加えて、MySQLのセッション変数の行動の形で他のリスクがあるかもしれません。 MySQLは、select文でセッション変数への代入が行われる順序を保証しません。したがって、パーティション(問題)でランクをシミュレートするクエリは信頼できない場合があります。しかし、我々はまだ、各チームのトップ5の長さにラベルを付けるために相関サブクエリを使用して問題を解決することができます:このクエリは限界があることを

SELECT 
    team, 
    SUM(length) AS totalScore 
FROM 
(
    SELECT 
     team, 
     length, 
     competition, 
     (SELECT COUNT(*) FROM reg_catches t2 
     WHERE t2.team = t1.team AND t2.length >= t1.length) cnt 
    FROM reg_catches t1 
) t 
WHERE 
    cnt <= 5 AND 
    competition = 16 
GROUP BY 
    team 
ORDER BY 
    team; 

注存在絆があるはずです。もしネクタイが予想されるなら、私たちはネクタイを破るために他の列を使ってこれを回避することができます。

出力:ここ

team totalScore 
1 25  520 
2 26  70 

デモ:あなたは、各teamのためのトップ5行を取得したい場合は、それぞれをランク付けするためのパラメータを利用することができる

Rextester

1

チームの結果:

あなたは、その後、必要に応じて、各チーム

SELECT team, sum(length) as 'total score' FROM 
(SELECT *, 
(@rank := if(@team = team, @rank + 1, if(@team := team, 1, 1))) as rank 
FROM (SELECT * from reg_catches order by team, length desc) ordered 
HAVING rank <= 5 
ORDER BY team, rank asc) top5 
GROUP BY team 
のためのトップ5の合計を取得するには、単純な集計/グループにそのクエリをラップでき http://sqlfiddle.com/#!9/6042ae/1

| team | length | competition | rank | 
+------+--------+-------------+------+ 
| 25 | 99 |  16  | 1 | 
| 25 | 98 |  16  | 2 | 
| 25 | 77 |  16  | 3 | 
| 25 | 76 |  16  | 4 | 
| 25 | 73 |  16  | 5 | 
| 26 | 96 |  16  | 1 | 
| 26 | 88 |  16  | 2 | 
| 26 | 87 |  16  | 3 | 
| 26 | 83 |  16  | 4 | 
| 26 | 79 |  16  | 5 | 

:以下を生成する10

http://sqlfiddle.com/#!9/6042ae/2

| team |total score| 
+-------+-----------+ 
| 25 | 423  | 
| 26 | 433  | 
| 27 | 426  | 

を1として、通常の注意事項は、パラメータに適用されます、しかし、あなたは本当にそれらなしでMySQLでランク付けすることはできません。私はまた、パラメータを適用する前に、最初は正しい順序でスコアを取得することに非常に敏感であることがわかりました。

これは最も洗練された解決策ではないかもしれませんが、私は助けてくれるといいと思います。

関連する問題