2016-04-26 7 views
1

consultant_project_scoreというテーブルがあります。id,project_idfinal_scoreというフィールドがあります。私は各project_idのトップ100のfinal_scoreを表示するクエリを生成したいと思います。 MySQL workbench 6.3を使用しており、create/insertステートメントを使用することはできません。これを達成する方法はありますか?MySQL:各カテゴリのトップ100レコードを取得する

+0

を与える必要があります?あなたは何を試しましたか? –

+0

[グループごとにLIMITを使用してグループごとにN個の結果を得るには?](http://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per) -group) – JimmyB

答えて

1

テストし、それはトリックはこれがあなたのために動作します

select id, project_id, final_score 
from 
(select id, project_id, final_score, 
     @rn:= if(@project_id= project_id, @rn+ 1, 1) as rn, 
     @project_id:= project_id as pi 
    from t,(SELECT @rn:=0) b 
    order by project_id, final_score desc) x 
where x.rn<= 100; 
+0

私はあなたの質問を試みました、私は 't'はconsultant_project_scoreの略であると仮定します。とにかく私は約2000万のプロジェクトを私のDBに持っているので、それは約200.000のレコードであったはずです。 –

+0

@MarcZaharescu固定、それは今働くべきです – Mihai

1

プロジェクトごとに行番号を生成することであるwork.Theべきではありません。内側のクエリはproject_idでランクグループを生成し、外側のクエリは上位100の結果をフィルタリングします。

注:project_idとスコアの同様の組み合わせがある場合は機能しません。このフィドルを作成して2ランクを得る。

http://sqlfiddle.com/#!9/9e94d5/1

SELECT id1, 
     project_id, 
     final_score 
FROM 
    (SELECT max(t1.id) AS id1, 
      t1.project_id, 
      t1.final_score, 
      count(*) AS rnk 
    FROM consultant_project_score t1 
    INNER JOIN consultant_project_score t2 ON t1.project_id=t2.project_id 
    WHERE t1.final_score<=t2.final_score 
    GROUP BY t1.project_id, 
      t1.final_score) t 
WHERE rnk<=100 
+0

私はあなたの質問を試しています。今は約10分間走っています。 –

+0

運がまだありませんか? – Utsav

+0

私はラムを使い果たしました:( –

0

この1つはGroup BYなしで、self joinの概念を使用しています。これは、正しい出力にあなたが得ているエラー何

SQL

SELECT cps2.id, cps2.project_id, cps2.final_score FROM 
        ( SELECT DISTINCT project_id FROM consultant_project_score) cps1 
        JOIN consultant_project_score cps2 
              ON cps2.id IN (SELECT cps3.id FROM consultant_project_score cps3 
          WHERE cps3.project_id = cps1.projectid 
          ORDER BY cps3.final_score DESC LIMIT 100) 
        ORDER BY cps2.project_id ,cps2.final_score DESC  
+0

エラーコード:1235.このバージョンのMySQLは、 'LIMIT&IN/ALL/ANY/SOMEサブクエリをサポートしていません。 '\t 0.000秒 –

関連する問題