在sql

时间:2016-02-18 20:10:33

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

我们说我有两张表如下:

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循环,直到我点击用户并计算上面的行?

2 个答案:

答案 0 :(得分:2)

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

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;

答案 1 :(得分:1)

您可以使用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 = ?

BTW - 我相信您的查询缺少group by子句。上面添加了。