2011-10-17 2 views
0

とカウント:どのようにグループのためにSQLクエリを最適化する私は3つのテーブル持っている優先順位列

User -- contains users 
Group -- contains a set of groups that users can be members of 
Membership -- Contains PKs from User and Group to indicate that User is a member of group 

をPK類は、それぞれユーザーID、グループID、およびMembershipIdであり、会員は、他の2つのテーブルにFKSを持っています。

これはかなり標準的なものです。ユーザーは複数のグループのメンバーになり、グループにはレベル(1,2,3,4)があります。ユーザーの現在のグループは、最高レベルのメンバーです。

今、各グループのメンバー数を取得したいと思います。私は優先順位の高いグループ内の別のメンバーシップがあるかどうかを確認するために探していますので、各ユーザーの

SELECT Count(*) FROM Membership 
    FROM Membership M1 
    INNER JOIN Group G1 ON M1.GroupId = G1.GroupId 
    INNER JOIN User ON User.UserId = M1.UserId 
WHERE 
    M1.GroupId = @groupId 
    AND NOT EXISTS (
      SELECT * FROM Membership M2 
      INNER JOIN Group G2 ON M2.GroupId = G2.GroupId 
      WHERE M2.UserId = M1.UserId 
      AND G1.Priority < G2.Priority) 

:現時点では私はこのような何かを持っています。これは明らかにかなり恐ろしいです、特に行がたくさんあるときには、私はそれを改善する方法を少し失っています。私はちょうど1つの選択すべてのグループのカウントを取得するのではなくなるよう

理想的には、私はそれを変換したいと思います(上記のように。)

任意のアイデアをどのようにより効率的にこれを行うには?

答えて

0

どのRDBMS?これはSQL Serverで動作します...

SELECT 
    HighestGroupId, 
    COUNT(*) AS Members 
FROM 
(
    SELECT 
     m.UserID, 
     MAX(m.GroupId) AS HighestGroupId 
    FROM Membership m 
    GROUP BY m.UserID 
) sub 
GROUP BY HighestGroupId