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的列。我添加了一个如何实现的示例