Mysql 如何获取每个类别的前n个记录
我有一张像下面这样的桌子,放在 我需要一个SQL来从上表中检索每个类别(proj)的前n名(比如前2名)评级计数 所需OP如下所示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 试图遵循此方法,但无法从我的表
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 |