4

postsフォーラムのすべての投稿が保存されている mysql テーブルがあります。こんな感じです:

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

正しいランクを出すためのクエリを取得するにはどうすればよいですか?

4

1 に答える 1

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

特定の人を取得し、「HAVING」句を試行する際に問題が発生した場合は、それをまとめてから where... を適用します。

select WrappedQuery.* 
   from ( entire query from above ) WrappedQuery
   where WrappedQuery.uid = SinglePerson
于 2012-04-23T19:03:18.580 に答える