Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Erstellen Sie eine Ansicht, die Rang, Benutzername und Anzahl der Benutzerdatensätze erhält

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.