Du var på rätt spår. Behövde bara göra mindre ändringar. Följande fråga ger dig de önskade resultaten. I den inre frågan fick de första 4 kolumnerna och för att få rangordnade kors förenade det till (SELECT @curRank := 0) r
vilket är ett MySQL-trick för att få ranking. i slutändan behövde bara beställa av Cnt för att få det att fungera.
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
För att lägga till det i View kan du använda hack som beskrivs av @Gordon-Linoff i den här frågan
Slutkoden kommer att se ut ungefär så här.
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
används för att få första 4 kolumner som du definierat. TestView2
du väljer bara allt från den första vyn och lägger sedan till en kolumn som kontrollerar om värdet du väljer är större eller mindre än värdet i första instans av den vyn.