2011-10-17 114 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