2016-04-26 179 views
1

我有一个表称为:consultant_project_score它具有以下字段id,project_id,final_score。我想要生成一个查询,显示每个project_id的前100个final_score。我正在使用MySQL workbench 6.3,我无法使用任何create/insert陈述。有什么办法可以做到这一点?MySQL:获得每个类别的前100条记录

+0

什么错误你得到?你试过什么? –

+0

[在GROUP BY中使用LIMIT获得每个组的N个结果?]可能的重复(http://stackoverflow.com/questions/2129693/using-limit-within-group-by-to-get-n-results-per -group) – JimmyB

回答

1

没有测试,但它应该work.The关键是产生一个行号为每个项目

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。无论如何,它产生了9百万条记录,而我只有大约2000个项目在我的数据库中,所以它应该有大约200.000条记录 –

+0

@MarcZaharescu修复,它现在应该工作 – Mihai

1

这会为你工作。内部查询将通过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

这一个是没有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秒 –