2011-05-10 95 views
3

我有一个小应用程序,用户可以在其中登录并执行其中的任何操作。关于用户的数据库结构不是什么幻想。有三个表: SQL查询:查看用户和组之间的关系

  • 用户
  • user_group_relation
  • 现在,我怎样才能得到所有组成员与一起地位的列表,为用户的阵列?

    让我通过一个例子来说明这一点。

    大卫'用户''管理员''经济' 的成员
    埃里克是'用户' 成员,管理员
    理查德是成员'administrators'
    Lisa是的成员'管理员''经济'

    下面是结果我想从一个SQL查询

    GroupName.......................isEveryoneAMember 
    
    users ...................... someAre 
    Administrators..........  yes 
    Economy ..................  someAre 
    Sales ....................... no 
    

    回答

    0
    select g.GroupName, 
        case 
         when count(ug.userId) = (select count(*) from users) then 'yes' 
         when count(ug.userId) = 0 then 'no' 
         else 'someAre' 
        end as HowMany 
    from Groups g 
    join UserGroups ug on g.id = ug.groupId 
    group by g.groupName 
    
    1
    SELECT g.name, 
         CASE 
         WHEN mcount = 0 THEN 
           'none' 
         WHEN mcount = ucount THEN 
           'all' 
         ELSE 
           'some' 
         END AS isEveryOneAMember 
    FROM (
         SELECT COUNT(*) AS ucount 
         FROM users 
         ) u 
    CROSS JOIN 
         (
         SELECT group_id, 
           COUNT(*) AS mcount 
         FROM user_group_relation ug 
         GROUP BY 
           group_id 
         ) ug 
    JOIN groups g 
    ON  g.id = ug.group_id 
    
    +0

    甜。看起来非常好:)我会尝试一下emideatly。 – David 2011-05-10 11:52:30

    0

    假设有没有重复的组名:

    WITH rollcall AS (
        SELECT 
        g.name, 
        ug.user_id 
        FROM groups g 
        CROSS JOIN users u 
        LEFT JOIN user_group_relation ug ON g.id = ug.group_id AND u.id = ug.user_id 
    ) 
    SELECT 
        GroupName = name, 
        isEveryoneAMember = CASE COUNT(user_ud) 
        WHEN 0  THEN 'No' 
        WHEN COUNT(*) THEN 'Yes' 
        ELSE 'someAre' 
        END 
    FROM rollcall 
    GROUP BY name