我需要一些帮助,用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的每个长度编写特定的查询。
我该如何解决这个问题?
我将不胜感激任何帮助!
答案 0 :(得分:2)
SELECT user_id
FROM table_user_flags
WHERE flag IN (1,2)
GROUP BY user_id
HAVING COUNT(DISTINCT flag)=2;
答案 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);
如果count(*)
在表格中是唯一的,那么您可以使用user_id, flag_id