MySQL - ранжирование по количеству () и GROUP BY

У меня есть мой MySQL стол postsгде хранятся все посты моего форума. Это вот так:

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

Как я могу получить запрос, чтобы выставить правильный ранг?

1 ответ

Решение

Вам нужен весь ваш набор результатов, сгруппированный по идентификатору пользователя и упорядоченный... затем примените ранжирование

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
Другие вопросы по тегам