Бяхте на прав път. Нужни са само дребни промени. Следното запитване ще ви даде желаните резултати. Във вътрешната заявка се получиха първите 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
За да го поставите във View, можете да използвате хак, описан от @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
просто избирате всичко от първия изглед и след това добавяте колона, която проверява дали стойността, която избирате, е по-голяма или по-малка от стойността в първия екземпляр на този изглед.