【问题标题】: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 个单独的查询?

谢谢!

【问题讨论】:

    标签: mysql sql-order-by


    【解决方案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。 . .该代码初始化变量。很难看出它是如何破坏任何东西的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2012-11-08
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多