Du warst auf dem richtigen Weg. Musste nur kleine Änderungen vornehmen. Die folgende Abfrage liefert Ihnen die gewünschten Ergebnisse. In der inneren Abfrage wurden die ersten 4 Spalten erhalten und um den Rang zu erhalten, wurde dieser mit (SELECT @curRank := 0) r
verknüpft Das ist ein MySQL-Trick, um einen Rang zu bekommen. Am Ende musste nur noch bei Cnt bestellt werden, damit es funktioniert.
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
Um es anzuzeigen, können Sie den von @Gordon-Linoff beschriebenen Hack verwenden in dieser Frage
Der Endcode sieht in etwa so aus.
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
wird verwendet, um die ersten 4 Spalten zu erhalten, die Sie definiert haben. TestView2
Sie wählen einfach alles aus der ersten Ansicht aus und fügen dann eine Spalte hinzu, die überprüft, ob der von Ihnen ausgewählte Wert größer oder kleiner als der Wert in der ersten Instanz dieser Ansicht ist.