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