Vous étiez sur la bonne voie. Juste besoin de faire des changements mineurs. La requête suivante vous donnera les résultats souhaités. Dans la requête interne, j'ai obtenu les 4 premières colonnes et pour obtenir le classement croisé, j'ai joint cela à (SELECT @curRank := 0) r
qui est une astuce MySQL pour obtenir un classement. au final juste besoin de commander par Cnt pour que ça marche.
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
Pour le mettre dans View, vous pouvez utiliser le hack décrit par @Gordon-Linoff dans cette question
Le code de fin ressemblera à ceci.
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
est utilisé pour obtenir les 4 premières colonnes que vous avez définies. TestView2
vous venez de tout sélectionner dans la première vue et d'ajouter une colonne qui vérifie si la valeur que vous sélectionnez est plus grande ou plus petite que la valeur dans la première instance de cette vue.