Je was op de goede weg. Moest alleen kleine wijzigingen aanbrengen. De volgende query geeft u de gewenste resultaten. In innerlijke query kreeg de eerste 4 kolommen en om rang te krijgen, voegde het kruis dat toe aan (SELECT @curRank := 0) r
wat een MySQL-truc is om rang te krijgen. uiteindelijk moest ik gewoon bestellen bij Cnt om het te laten werken.
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
Om het in View te zetten, kun je de hack gebruiken die wordt beschreven door @Gordon-Linoff in deze vraag
De eindcode ziet er ongeveer zo uit.
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
wordt gebruikt om de eerste 4 kolommen te krijgen die u hebt gedefinieerd. TestView2
u selecteert gewoon alles uit de eerste weergave en voegt vervolgens een kolom toe die controleert of de waarde die u selecteert groter of kleiner is dan de waarde in eerste instantie van die weergave.