Mysql
 sql >> Base de données >  >> RDS >> Mysql

créer une vue qui obtient le rang, le nom d'utilisateur et le nombre d'enregistrements d'utilisateurs

Vous étiez sur la bonne voie. Juste besoin de faire des changements mineurs. La requête suivante vous donnera les résultats souhaités. Dans la requête interne, j'ai obtenu les 4 premières colonnes et pour obtenir le classement croisé, j'ai joint cela à (SELECT @curRank := 0) r qui est une astuce MySQL pour obtenir un classement. au final juste besoin de commander par Cnt pour que ça marche.

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

Pour le mettre dans View, vous pouvez utiliser le hack décrit par @Gordon-Linoff dans cette question

Le code de fin ressemblera à ceci.

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 est utilisé pour obtenir les 4 premières colonnes que vous avez définies. TestView2 vous venez de tout sélectionner dans la première vue et d'ajouter une colonne qui vérifie si la valeur que vous sélectionnez est plus grande ou plus petite que la valeur dans la première instance de cette vue.