postgres - 查找具有特定记录的唯一用户

时间:2013-08-27 12:02:46

标签: sql postgresql

我需要一些帮助,用postgres完成以下查询。

我有下表例如:(这是我想要完成的事情的本质)

让我们调用它 - table_user_flags

user_id flag
1        1
1        2
2        1
2        3
3        1
3        2
3        3

我需要找到所有具有特定标志记录的用户(在标志列下,每个标志至少有1条记录)

实施例: 具有标志1,3(即1和3)的记录的所有用户都回答(user_id 2,3) (但也希望扩展以便我可以请求标志1,2,3,4,5等)

我尝试了很多东西,不幸的是我无法很好地阐述情况,以便在谷歌上找到答案。

我最好的猜测(这是蹩脚的,可能是错误的)是(并提供了标志数组 - $ flag_arr)

select a.user_id
from table_user_flags a, table_user_flags b
where a.flag = $flag_arr[0] and b.flag = $flag_arr[1] and a.user_id=b.user_id

但是这个策略很慢,而且只有当我需要2个标志时才能工作,当我需要2个以上的标志时,我需要为flags_arr的每个长度编写特定的查询。

我该如何解决这个问题?

我将不胜感激任何帮助!

2 个答案:

答案 0 :(得分:2)

SELECT user_id
FROM table_user_flags
WHERE flag IN (1,2)
GROUP BY user_id
HAVING COUNT(DISTINCT flag)=2;

Fiddle

答案 1 :(得分:0)

select user_id
from table_user_flags as t
    inner join (select unnest($flag_arr) as flag) as c on c.flag = t.flag 
group by t.user_id
having count(distinct t.flag) = array_length($flag_arr, 1);

select user_id
from table_user_flags as t
where t.flag = any($flag_arr)
group by t.user_id
having count(distinct t.flag) = array_length($flag_arr, 1);

sql fiddle demo

如果count(*)在表格中是唯一的,那么您可以使用user_id, flag_id