按排名按顺序设置字段,但在另一个字段的组中
Posted
技术标签:
【中文标题】按排名按顺序设置字段,但在另一个字段的组中【英文标题】:Set field by order by rank, but in another field's groups 【发布时间】:2017-09-20 01:40:13 【问题描述】:我是新来的,被mysql问题难住了。
我的表有以下文件: 用户名 VARCHAR,状态 VARCHAR,得分 INT,排名 INT
我正在尝试根据用户分数设置排名字段,但按州单独设置。
我发现如果我忽略状态,我可以为他们设置排名:
SET @pos := 0;更新配置文件 SET rank = ( SELECT @pos := @pos + 1 ) 现金 DESC 订购
我可以将它设置为这样的单一状态:
"SET @pos := 0; 更新配置文件 SET rank = ( SELECT @pos := @pos + 1 ) WHERE homeState = 'Arizona' ORDER BY cash DESC"
是否可以按状态对它们进行分组,并在单个查询中按状态设置它们的排名,而不是 50 个单独的查询?
谢谢!
【问题讨论】:
【参考方案1】:您可以在select
中这样做:
select p.*,
(@rn := if(@s = state, @rn + 1,
if(@s := state, 1, 1)
)
) as rn
from profiles p cross join
(select @s := '', @rn := 0) params
order by state, score desc;
要将其放入更新中,您可以使用join
:
update profiles p join
(select p.*,
(@rn := if(@s = state, @rn + 1,
if(@s := state, 1, 1)
)
) as rn
from profiles p cross join
(select @s := '', @rn := 0) params
order by state, score desc
) pp
on p.username = pp.username
set p.rank = pp.rn;
【讨论】:
嘿,非常感谢您的帮助!然而,这仍然让我很难过。分配排名时,提供的更新查询似乎忽略了分数。给定表格条目:>bilbo, arizona, 5, 0 给定表格条目:bilbo, arizona, 5, 0 | fam, 阿拉斯加, 1, 0 |挖,阿拉斯加,0, 0 |弗罗多,亚利桑那州,2, 0 | zidon, arizona, 3, 0. 我预计排名为 1,1,2,3,2 但我得到 1,1,2,1,2。 另外,我应该提到对于“rank = rn”,rank 是模棱两可的。我必须做 p.rank = rn,所以这可能是个问题。 嘿,对于任何想知道的人,在出于某种原因删除“cross join (select @s := '', @rn := 0) params”之后,它现在似乎可以正常工作了。虽然我不确定那条线的用途,所以删除它需要您自担风险:D。 @ZacharyNelson。 . .该代码初始化变量。很难看出它是如何破坏任何东西的。以上是关于按排名按顺序设置字段,但在另一个字段的组中的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 中按日期列排序的组中对列进行排名