2012-04-23 25 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

+0

@mellamokb DESCとASCでは動作しません – ninov

+0

どういう意味でしょうか? – mellamokb

答えて

6

あなたは...その後、特定の人のために取得するには、ランキング

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 

を適用するあなたの全体の結果セットが最初のユーザIDでグループ化されたと命じ必要があり、問題は、私は、その後、句を考え、「HAVING」をしようそれを包み込み、どこに適用しますか?

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

ありがとうございました:) – ninov

+0

うーん、指定されたuidに対して1行しか返せないのですか? – ninov

+0

@Ninov、はい、クエリの最も外側の部分に追加するだけです。prequery.uid = IDOfPersonWanted – DRapp

関連する問題