2011-10-17 76 views
0

计数我有三个表:如何优化SQL查询组具有优先级列

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 

的PKS分别为用户ID,的GroupId和MembershipId和成员具有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) 

所以对于我想看看是否有具有较高优先级的组中的其他成员每个用户。这显然非常可怕,特别是当你有很多行的时候,但是我在如何改进它方面存在一些损失。

理想情况下,我想改变它,这样我得到的所有计数组,而不是只选择一个(如前所述)

任何想法如何更有效地做到这一点?

回答

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