SQL仅为特定组列表中的用户选择

SQL仅为特定组列表中的用户选择,sql,Sql,我需要选择特定用户组中的一组用户,但仅在这些用户组中选择 User 1 2 3 Group a b c UserToGroup 1, a 1, b 1, c 2, a 2, c 3, b 3, c 用户必须仅在a组和c组中 Result 2, a 2, c Group和User都是缩放表,因此在查询中排除不需要的组不是一个选项。如果希望用户只在A和C中,则可以执行以下操作: SELECT MIN(USER_ID) AS USER_ID FROM UserToGroup

我需要选择特定用户组中的一组用户,但仅在这些用户组中选择

User
1
2
3

Group
a
b
c

UserToGroup
1, a
1, b
1, c
2, a
2, c
3, b
3, c
用户必须在a组和c组中

Result
2, a
2, c

Group和User都是缩放表,因此在查询中排除不需要的组不是一个选项。

如果希望用户只在A和C中,则可以执行以下操作:

SELECT 
    MIN(USER_ID) AS USER_ID
FROM
    UserToGroup
HAVING
    MIN(USER_GROUP) = 'a' AND MAX(USER_GROUP) = 'c'
如果它们位于A、C和D中,那么该查询将不适用于您

你也可以试试

SELECT 
    USER_ID
FROM
    UserToGroup
WHERE USER_GROUP = 'a' 
      AND USER_ID IN (SELECT USER_ID FROM UserToGroup WHERE USER_GROUP = 'c')
此查询获取“a”中的所有用户,并针对“c”中的用户在同一个表中查找子查询。

使用:

SELECT *
FROM UserToGroup
WHERE `user` IN (
  SELECT `user`
  FROM UserToGroup
  GROUP BY `user`
  HAVING count(distinct `group`)
     = count(distinct CASE WHEN `group` IN ('a','c') THEN `group` END )
)
演示:



我需要不同的用户。我已经减少了user的列,以简化 例如

要从
用户
获取数据,请使用此查询:

SELECT *
FROM Users
WHERE `user` IN (
  SELECT `user`
  FROM UserToGroup
  GROUP BY `user`
  HAVING count(distinct `group`)
     = count(distinct CASE WHEN `group` IN ('a','c') THEN `group` END )
)

演示:

您可以在
HAVING
子句中尝试条件聚合,该子句检查
'a'
'c'
的计数是否正好为1,其他所有计数是否为0

假设
usertogroup
的列名是
user
group

SELECT ug1.user,
       ug1.group
       FROM usertogroup ug1
            INNER JOIN (SELECT ug2.user
                               FROM usertogroup ug2
                               GROUP BY ug2.user
                               HAVING count(CASE 
                                              WHEN ug2.group = 'a') THEN
                                                1
                                            END) = 1
                                      AND count(CASE 
                                                  WHEN ug2.group = 'c') THEN
                                                    1
                                                END) = 1
                                      AND count(CASE
                                                  WHEN ug2.group NOT IN ('a', 'c') THEN
                                                    1
                                                END) = 0) x
                       ON x.user = ug1.user;

我希望这就是你想要的:

       SELECT
         CASE WHEN GROUPS IN ('a','c')
         THEN 
          USERS||'-'||GROUPS  
          ELSE
          'USER IN SOME OTHER GROUP'
            END CASE 

         FROM TABLE order by Groups ;

编辑:我修改了查询以包含用户表中的其他数据

如果您需要从
用户
和/或
获取其他数据,您可以使用简单的
不存在
连接,以消除除选择列表之外的记录。它应该优化得很好。
拥有计数(*)
依赖于
用户和
组的
用户组
中不存在多个链接记录。如果其中一个是问题,则可以进一步过滤查询以消除这些重复项。还需要传递正在搜索的组数。如何将此值列表传递给查询

SELECT u.uid AS userid, u.otherstuff
FROM usr u
INNER JOIN usertogroup utg ON u.uid = utg.uid
INNER JOIN grp g ON utg.gid = g.gid
  AND g.gid IN ('a','c')
WHERE NOT EXISTS ( 
    SELECT 1
    FROM usertogroup utg2 
    WHERE utg2.gid NOT IN ('a','c')
       AND utg2.uid = u.uid
)
GROUP BY u.uid, u.otherstuff
HAVING count(*) = 2 /* # of items in list to search. */
演示:


首先获取恰好属于两个组的用户,然后应用这些组为
a
c
的条件:

select u.* from UserToGroup as u 
inner join (
  select userid from UserToGroup 
  group by userid
  having count(*) = 2
) as t
on 
  t.userid = u.userid
  and
  u.groupid IN ('a', 'c')
  and 
  not exists (
    select 1 
    from UserToGroup as uu 
    where 
      uu.userid = t.userid 
      and 
      uu.groupid NOT IN ('a', 'c')
  )

请参见

SQL的类型和版本?是否希望用户位于组
a
或组
c
(但无其他)中,或同时位于组
a
和组
c
(但无其他)中?用户必须位于所提供列表的所有组中。SQL版本:MySQL 5.5.60-0+DEB7U1您从未回答您正在使用的RDBMS。这个问题仍然需要正确地标记。差不多了,我可以有不同的结果集,这样我就可以轻松地加入到用户表中吗?你想得到不同的用户吗?或不同的对:组+用户?我不理解这个要求。在本例中,我看不出将此查询加入
users
表的原因,因为
users
包含与
UserToGroup
表中完全相同的用户id,仅此而已。我需要不同的用户。为了简化示例,我减少了user的列。我添加了一个如何实现的示例