Você estava no caminho certo. Só precisava fazer pequenas alterações. A consulta a seguir fornecerá os resultados desejados. Na consulta interna, obtive as primeiras 4 colunas e, para obter a classificação, juntei-a a
(SELECT @curRank := 0) r
que é o truque do MySQL para obter classificação. no final só faltava encomendar pelo Cnt para que funcionasse. SELECT username
,userid
,category
,Cnt
,@curRank := @curRank + 1 AS rank
FROM (
SELECT b.Username
,B.userid
,A.category
,count(*) Cnt
FROM tblb B
JOIN tbla A
ON B.UserID = A.User
WHERE a.Category = 1
GROUP BY b.username
)a
,(SELECT @curRank := 0) r
Order by cnt desc
Para colocá-lo no View, você pode usar o hack descrito por @Gordon-Linoff nesta pergunta
O código final será algo assim.
CREATE VIEW TestView1
AS
SELECT b.Username
,B.userid
,A.category
,COUNT(*) Cnt
FROM tblb B
JOIN tbla A
ON B.UserID = A.User
WHERE a.Category = 1
GROUP BY b.username
ORDER BY cnt DESC;
CREATE VIEW TestView2
AS
SELECT t1.*
,( SELECT 1 + COUNT(*)
FROM TestView1 AS t2
WHERE t2.Cnt > t1.Cnt
OR (
t2.Cnt = t1.Cnt
AND t2.userid < t1.userid ) ) AS Rank
FROM TestView1 AS t1
TestView1
é usado para obter as primeiras 4 colunas que você definiu. TestView2
você apenas seleciona tudo da primeira exibição e adiciona uma coluna que verifica se o valor que você seleciona é maior ou menor que o valor na primeira instância dessa exibição.