Sql 检索与列出的所有值匹配的行

Sql 检索与列出的所有值匹配的行,sql,postgresql,Sql,Postgresql,您好,我需要获取与列为数组的所有groupid匹配的行 SELECT user_id,group_id FROM group_privilege_details g WHERE g.group_id in (102,101) 如果任何一个groupid匹配,这将返回我。但是,我需要userid,它包含列表中提到的所有groupid 假设您不能有重复的用户id/组id组合: SELECT user_id,count(group_id) FROM group_privilege_detail

您好,我需要获取与列为数组的所有groupid匹配的行

SELECT user_id,group_id 
FROM group_privilege_details g
WHERE g.group_id in (102,101) 

如果任何一个groupid匹配,这将返回我。但是,我需要userid,它包含列表中提到的所有groupid

假设您不能有重复的用户id/组id组合:

SELECT user_id,count(group_id)
 FROM group_privilege_details g
WHERE g.group_id in (102,101) 
GROUP BY user_id
HAVING count(group_id) = 2

假设您不能有重复的用户id/组id组合:

SELECT user_id,count(group_id)
 FROM group_privilege_details g
WHERE g.group_id in (102,101) 
GROUP BY user_id
HAVING count(group_id) = 2

下面是Steven查询通用数组的一个变体:

SELECT user_id
FROM   group_privilege_details
WHERE  group_id = ANY(my_array)
GROUP  BY 1
HAVING count(*) = array_length(my_array, 1)
只要满足这些要求(问题中未提及)即可进行工程:

  • (用户id、组id)在
    组权限\u详细信息中是唯一的
  • 数组只有一个维度
  • 基数组元素是唯一的
一种通用解决方案,无论这些先决条件如何:

WITH   ids AS (SELECT DISTINCT unnest(my_array) group_id)
SELECT g.user_id
FROM   (SELECT user_id, group_id FROM group_privilege_details GROUP BY 1,2) g
JOIN   ids USING (group_id)
GROUP  BY 1
HAVING count(*) = (SELECT count(*) FROM ids)
每个基本元素生成一行
DISTINCT
删除可能的重复。子选择对表执行相同的操作


这类查询的广泛选项列表:

下面是Steven对通用数组查询的一个变体:

SELECT user_id
FROM   group_privilege_details
WHERE  group_id = ANY(my_array)
GROUP  BY 1
HAVING count(*) = array_length(my_array, 1)
只要满足这些要求(问题中未提及)即可进行工程:

  • (用户id、组id)在
    组权限\u详细信息中是唯一的
  • 数组只有一个维度
  • 基数组元素是唯一的
一种通用解决方案,无论这些先决条件如何:

WITH   ids AS (SELECT DISTINCT unnest(my_array) group_id)
SELECT g.user_id
FROM   (SELECT user_id, group_id FROM group_privilege_details GROUP BY 1,2) g
JOIN   ids USING (group_id)
GROUP  BY 1
HAVING count(*) = (SELECT count(*) FROM ids)
每个基本元素生成一行
DISTINCT
删除可能的重复。子选择对表执行相同的操作


此类查询的广泛选项列表:

请查找我已解决的查询:

select user_id,login_name from user_info where user_id in (
SELECT user_id  FROM 
group_privilege_details g WHERE g.group_id in 
(select group_id from group_privilege_details g,user_info u where u.user_id=g.user_id
and login_name='123')  
GROUP BY user_id HAVING count(group_id) = (select count(group_id) 
from group_privilege_details g,user_info u where u.user_id=g.user_id
and login_name='123') ) and login_name!='123'

请查找我已解决的问题:

select user_id,login_name from user_info where user_id in (
SELECT user_id  FROM 
group_privilege_details g WHERE g.group_id in 
(select group_id from group_privilege_details g,user_info u where u.user_id=g.user_id
and login_name='123')  
GROUP BY user_id HAVING count(group_id) = (select count(group_id) 
from group_privilege_details g,user_info u where u.user_id=g.user_id
and login_name='123') ) and login_name!='123'

好啊谢谢这是有效的。但是,如果组id列表反过来是一个子查询呢?那一次我不能使用“having”@Nila:你是说
g.group\u id在哪里(选择…
),而不是
g.group\u id在哪里(102101)
?如果是这样的话,为什么你认为你不能在这种情况下使用have?好的。谢谢这是有效的。但是,如果组id列表反过来是一个子查询呢?那一次我不能使用“having”@Nila:你是说
g.group\u id在哪里(选择…
),而不是
g.group\u id在哪里(102101)
?如果是这样的话,为什么你认为你不能在这种情况下使用have?谢谢。它为我的提问提供了思路。谢谢。它为我的提问提供了思路。