Mysql 如何获取每个类别的前n个记录

Mysql 如何获取每个类别的前n个记录,mysql,greatest-n-per-group,mysql-python,Mysql,Greatest N Per Group,Mysql Python,我有一张像下面这样的桌子,放在 我需要一个SQL来从上表中检索每个类别(proj)的前n名(比如前2名)评级计数 所需OP如下所示 proj empid ratings ~~~~ ~~~~~ ~~~~~~~ G1 1863 4 G1 P4645 3 G2 P6682 3 G2 P4645 2 G3 P4645 3 G3 1863 2 G3 P6682 2 试图遵循此方法,但无法从我的表

我有一张像下面这样的桌子,放在

我需要一个SQL来从上表中检索每个类别(proj)的前n名(比如前2名)评级计数

所需OP如下所示

proj  empid  ratings
~~~~  ~~~~~  ~~~~~~~
 G1   1863      4
 G1   P4645     3
 G2   P6682     3
 G2   P4645     2
 G3   P4645     3
 G3   1863      2
 G3   P6682     2
试图遵循此方法,但无法从我的表设计中实现。

使用此:-

(
  select proj,empid,rating,count(rating)
  from achivement 
  where `proj` =  'G1'
  group by empid
  order by count(rating) desc
  LIMIT 2
)
UNION ALL
(
  select proj,empid,rating,count(rating)
  from achivement 
  where `proj` =  'G2'
  group by empid
  order by count(rating) desc
  LIMIT 2
)
UNION ALL
    (
      select proj,empid,rating,count(rating)
      from achivement 
      where `proj` =  'G3'
      group by empid
      order by count(rating) desc
      LIMIT 2
    )

截图

尝试此查询

select * from 
(select @rn:=if(@prv=Proj, @rn+1, 1) as rId,
@prv:=Proj,
empid, 
stars
from
(SELECT
          starRatings.Proj
        , starRatings.empid
        , count(*) as stars
    FROM achivement as starRatings
    group by starRatings.Proj,starRatings.empid
order by proj, stars desc)a
join 
(select @rn:=0, @prv:='') tmp
)tmp where rid <= 2

这只有在你提前知道所有可能的类别时才有效。@Barmar是的,这是真的。我假设用户事先知道所有组:-当我为empid=P6682和proj=G3添加一条记录时,G@中前2名的结果将有3条记录,但您的SQL显示firsr 2,即使第2个第3个有2颗星。。。检查她的
http://sqlfiddle.com/#!2/7420a/2
检查编辑答案是否已根据您的需要更新查询…第一次查询中有错误,根据计数未返回。已更新。在工作台中工作正常。但是我将从python执行这个SQL。因为您使用了SQL变量
@rn、@prv、@prvv
,这将在python中产生错误。是否有其他替代方法,如
连接、子查询的
为什么返回错误??检查如何在python中以字符串形式转义这些字符。我认为它不应该返回错误。
select * from 
(select @rn:=if(@prv=Proj, @rn+1, 1) as rId,
@prv:=Proj,
empid, 
stars
from
(SELECT
          starRatings.Proj
        , starRatings.empid
        , count(*) as stars
    FROM achivement as starRatings
    group by starRatings.Proj,starRatings.empid
order by proj, stars desc)a
join 
(select @rn:=0, @prv:='') tmp
)tmp where rid <= 2
select * from 
(select @rn:=if(@prv=Proj, if(@prvv=stars, @rn, @rn+1), 1) as rId,
@prv:=Proj,
empid, 
@prvv:=stars
from
(SELECT
          starRatings.Proj
        , starRatings.empid
        , count(*) as stars
    FROM achivement as starRatings
    group by starRatings.Proj,starRatings.empid
    order by proj, stars desc)t
join 
(select @rn:=0, @prv:='', @prvv:=0) tmp
)tmp where rid <= 2
| RID | @PRV:=PROJ | EMPID | @PRVV:=STARS |
-------------------------------------------
|   1 |         G1 |  1863 |            4 |
|   2 |         G1 | P4645 |            3 |
|   1 |         G2 | P6682 |            3 |
|   2 |         G2 | P4645 |            2 |
|   1 |         G3 | P4645 |            3 |
|   2 |         G3 |  1863 |            2 |
|   2 |         G3 | P6682 |            2 |