2012-04-23 875 views
4

我有我的mysql表posts,其中我的论坛的所有帖子都存储。这是这样的:MySQL - 按count()和GROUP BY排序

id  uid  thread  post  title  text  time 
(int) (int) (varchar) (int)  (varchar) (text) (int) 

现在我想显示用户配置文件的排名(职位数量的排名)。我试过这样的事情:

set @rownum := 0; 
SELECT @rownum := @rownum + 1 AS rank, uid, count(id) 
FROM `posts` GROUP BY uid ORDER BY count(id) 

但它返回不正确的数据。 uid和count(id)匹配,但排名错误。 我的条目是这样的:

rank  uid  count(id) 
    1  1  214 

我的用户1,和我有214发的帖子,但不是以秩1 还有像其他条目:

rank  uid  count(id) 
    8  22  674 

我怎样才能得到查询排列正确的排名?

+2

这就是'ORDER BY count(id)DESC'吧? – mellamokb 2012-04-23 18:52:18

+0

@mellamokb它不适用于DESC和ASC – ninov 2012-04-23 18:58:14

+0

不确定你的意思? – mellamokb 2012-04-23 19:02:40

回答

6

你需要你的整个结果集通过用户ID进行分组,并下令...然后应用排名

select 
     @rownum := @rownum +1 as rank, 
     prequery.uid, 
     prequery.PostCount 
    from 
     (select @rownum := 0) sqlvars, 
     (SELECT uid, count(id) postCount 
      from posts 
      group by uid 
      order by count(id) desc) prequery 

要得到一个具体的人,并试图将“具有”条款的问题,我会再把它包起来然后应用一个地方...

select WrappedQuery.* 
    from (entire query from above) WrappedQuery 
    where WrappedQuery.uid = SinglePerson 
+0

谢谢,那工作:) – ninov 2012-04-23 19:08:55

+0

嗯,是否有可能只返回一个指定的uid行? – ninov 2012-04-23 19:10:08

+0

@Ninov,是的,只是添加到查询的最外面部分... HAVING prequery.uid = IDOfPersonWanted – DRapp 2012-04-23 19:19:58