【问题标题】:Get the rank of the row given the order in sql在sql中获取给定顺序的行的排名
【发布时间】:2016-02-18 20:10:32
【问题描述】:

假设我有两个如下表:

user_id
1
2
3

post_id    user_id
1          2
2          3
3          2

第一个表包含所有用户信息,第二个表是用户发布的列表。

通过这些表格,我想对发布最多帖子的人进行排名。为此,我可以使用以下 sql

select user.user_id from user
left join post on user.user_id=post.user_id
order by  count(post.post_id)

这会给我

user_id
2
3
1

,但是如果我只想要一个用户的排名怎么办?换句话说,我想编写一个 sql 语句,返回给定 user_id 用户所在的位置。例如,如果我的 user_id 为 2,我希望 1 作为输出,如果我有 user_id 3,我希望 2 作为输出,如果我有 user_id 1,我希望 3 作为输出。

这可能吗,还是我必须选择整个表并在 php 中执行一个 while 循环,直到我点击用户并计算上面的行数?

【问题讨论】:

    标签: php mysql sql select sql-order-by


    【解决方案1】:

    不幸的是,对于单个用户的排名,您几乎必须计算每个人的排名,然后拉出单个用户。所以,所有用户的排名是:

    select u.user_id, count(p.post_id), (@rn := @rn + 1) as ranking
    from user u left join 
         post p
         on u.user_id = p.user_id cross join
         (select @rn := 0) params
    group by u.user_id
    order by count(p.post_id) desc;
    

    对于一个用户,使用子查询:

    select *
    from (select u.user_id, count(p.post_id), (@rn := @rn + 1) as ranking
          from user u left join 
               post p
               on u.user_id = p.user_id cross join
               (select @rn := 0) params
          order by count(p.post_id) desc
         ) u
    where u.user_id = $USERID;
    

    【讨论】:

    • 这不是缺少group by 子句吗?您还需要为子查询中的列设置别名。
    • @sgeddes 。 . .谢谢。
    【解决方案2】:

    您可以为此使用user-defined variables

    select rnk
    from (
        select user.user_id, @rnk:@rnk+1 rnk
        from user
            left join post on user.user_id=post.user_id
            cross join (select @rnk:=0) t
        group by user.user_id
        order by count(post.post_id) desc
    ) t
    where user_id = ?
    

    顺便说一句——我相信您的查询缺少group by 子句。在上面添加。

    【讨论】:

    • 哦,是的,我的组丢失了。谢谢指正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多