Du var på rette vej. Mangler bare at lave mindre ændringer. Følgende forespørgsel vil give dig de ønskede resultater. I indre forespørgsel fik de første 4 kolonner og for at få rangkryds sammenføjede det til (SELECT @curRank := 0) r
hvilket er MySQL trick til at få rang. til sidst skulle man bare bestille af Cnt for at få det til at virke.
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
For at sætte det i View kan du bruge hack beskrevet af @Gordon-Linoff i dette spørgsmål
Slutkoden vil se nogenlunde sådan ud.
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
bruges til at få de første 4 kolonner, som du har defineret. TestView2
du vælger bare alt fra første visning og tilføjer derefter kolonne, der kontrollerer, om den værdi, du vælger, er ether større eller mindre end værdien i første instans af den visning.