我们说我有两张表如下:
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循环,直到我点击用户并计算上面的行?
答案 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
子句。上面添加了。