あなたは正しい方向に進んでいました。小さな変更を加える必要があります。次のクエリにより、目的の結果が得られます。内部クエリで最初の4列を取得し、ランクをクロス結合して(SELECT @curRank := 0) r
これは、ランクを取得するためのMySQLのトリックです。結局、それを機能させるためにCntによって注文する必要がありました。
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
ビューに表示するには、 @Gordon-Linoff
で説明されているハックを使用できます。
終了コードは次のようになります。
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
定義した最初の4列を取得するために使用されます。 TestView2
最初のビューからすべてを選択し、選択した値がそのビューの最初のインスタンスの値よりも大きいか小さいかを確認する列を追加するだけです。