按排名按顺序设置字段,但在另一个字段的组中

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 中按日期列排序的组中对列进行排名

如何分组并保留已排序文件上的组顺序

Sql 查询以获取最多 10 条的最新记录并按提到行排名的字段排序 [关闭]

使用 SQL 压缩时间段

sql按某个字段值顺序排序

在 Solr 中按特定顺序按多个字段排序