2013-08-27 27 views
1

我需要一些幫助完成postgres的以下查詢。postgres - 尋找具有特定記錄的唯一用戶

我有例如下表:(這是什麼IM,努力實現本質)

可以稱之爲 - 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等)

我嘗試了很多事情,很遺憾,我無法清楚地說明情況,以便在Google上找到答案。

我最好的猜測(這是瘸腿的,可能是錯誤的)是(並提供標誌陣列 - $ 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
SELECT user_id 
FROM table_user_flags 
WHERE flag IN (1,2) 
GROUP BY user_id 
HAVING COUNT(DISTINCT flag)=2; 

Fiddle

+0

哇,這是一個夢幻般的解決方案,非常感謝你! – user2721348

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是在表內唯一

相關問題