2011-04-27 33 views
0

我正在爲我的大學的Rails 3/PostgreSQL項目,我們有用戶,活動和場地。一個用戶有很多活動,一個場地有許多活動。活動屬於用戶和場所,因此具有user_id和venue_id。SQL查詢相互訪問的地方

我需要的是一個SQL查詢(甚至是來自Rails本身的一個方法?)來找到幾個用戶之間的相互位置。例如,我有5個用戶訪問過不同的場地。 5個用戶只有2個場所參觀。所以我想找回2個場地。

我已經通過檢索5個用戶的所有活動開始:

SELECT a.user_id as user, a.venue_id as venue 
FROM activities AS a 
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879 

但現在我需要一種方法來找出相互場地。 有什麼想法?

THX, 禮服

回答

1

我不完全熟悉PostgreSQL的SQL語法,但試試這個:

select venue_id, COUNT(distinct user_id) from activities Where user_id in (116,227,229,613,879) group by venue_id having COUNT(distinct user_id) = 5

編輯:

你需要改變「5」然而,許多你所關心的用戶關於(你正在尋找多少)。

我測試了這對錶結構如下所示:

 
user_id  venue_id id 
----------- ----------- ----------- 
1   1   1 
2   6   2 
3   3   3 
4   4   4 
5   5   5 
1   2   6 
2   2   7 
3   2   8 
4   2   9 
5   2   10 

產量爲:

 
venue_id  
----------- ----------- 
2   5 
+0

thx爲您的答案,它解決了它!正如我在Adrian的評論中寫到的那樣,你可以獲得聲望點;) – 23tux 2011-04-27 20:47:46

1

你將不得不拿出一些參數進行搜索。例如,5用戶可以有2個場地中常見的,但不是3

如果你想看到什麼場地這五個用戶有共通之處,你可以通過這樣開始:

SELECT a.venue_id, count(1) as NoOfUsers 
FROM activities AS a 
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879 
group by a.venue_id 

那倒爲這些用戶帶來了多少用戶擁有該場所。所以你有「場地分享」的程度。

但是,如果你想看到的只是誰是五個用戶訪問的場地,你會在末尾添加一行:

SELECT a.venue_id, count(1) as NoOfUsers 
FROM activities AS a 
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879 
group by a.venue_id 
having count(1) = 5 --the number of users in the query 

你也應該考慮

改變你 WHERE聲明
WHERE a.user_id=116 OR a.user_id=227 OR a.user_id=229 OR a.user_id=613 OR a.user_id=879 

WHERE a.user_id in (116, 227, 229, 613, 879) 
+0

THX,即解決了這個問題(令人難以置信的快速答案BTW),並且M.R.下面也用幾乎相同的方式解決了它。他獲得聲譽,因爲你有更多的;)對此感到抱歉! – 23tux 2011-04-27 20:46:55

+0

嗯,我想我只是很高興我幫助... – 2011-04-27 20:48:40

+0

但是,你應該知道,有些人可能會因此而感到氣餒:) – 2011-04-27 20:50:55

0

在SQL它會是這樣:

Select distinct v.venue_id 
from v.venues 
join activities a on a.venue_id = v.venue_id 
Join users u on u.user_id = a.user_id 
Where user_id in (116,227,229,613,879) 

你需要加入你的桌子,以便獲得所有已經有用戶活動的場地。當你剛剛學習時,如果你使用子查詢,它有時會更簡單。至少這就是我爲我找到的。

+0

對不起,但那不行。你的查詢中有錯誤,應該是'FROM venues AS v'。我收到用戶擁有的所有場地,但不是他們共有的場地。 – 23tux 2011-04-27 20:37:31