Получить строки, которые соответствуют всем перечисленным значениям - PullRequest
0 голосов
/ 21 октября 2011

Привет мне нужно получить строки, которые соответствуют всем groupid, перечисленным в виде массива

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

Это вернет меня, если совпадет любой из идентификаторов группы. Но мне нужен идентификатор пользователя, в котором есть все упоминания группы в списке.

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Предполагая, что у вас не может быть повторяющихся комбинаций user_id / group_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
1 голос
/ 21 октября 2011

Вот вариант запроса Стивена для универсальных массивов:

SELECT user_id
FROM   group_privilege_details
WHERE  group_id = ANY(my_array)
GROUP  BY 1
HAVING count(*) = array_length(my_array, 1)

Работает при условии соблюдения этих требований (не упомянутых в вопросе):

  • (user_id, group_id) уникален в group_privilege_details.
  • массив имеет только 1 измерение
  • базовые элементы массива уникальны

A универсальное решение , которое работает независимо от следующих условий:

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)

unnest () создает одну строку для каждого базового элемента. DISTINCT удаляет возможные дубликаты. Подвыбор делает то же самое для таблицы.

Обширный список опций для запросов такого типа: Как отфильтровать результаты SQL в соотношении "сквозная связь"

0 голосов
/ 22 октября 2011

Пожалуйста, найдите мой решенный запрос:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...