1

我需要一些帮助来使用 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 的每个长度编写特定的查询。

我该如何解决这个问题?

我将不胜感激任何帮助!

4

2 回答 2

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

小提琴

于 2013-08-27T12:06:43.483 回答
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在表内是唯一的,您可以使用

于 2013-08-27T12:15:16.937 回答