SQL-запрос для взаимно посещаемых мест - PullRequest
0 голосов
/ 28 апреля 2011

Я работаю над проектом для моего университета с Rails 3 / PostgreSQL, где у нас есть пользователи, действия и места.У пользователя есть много действий, и у места есть много действий.Действие принадлежит пользователю и месту и поэтому имеет user_id и venue_id.

Мне нужен SQL-запрос (или даже метод самого Rails?), Чтобы найти взаимные места между несколькими пользователями.Например, у меня есть 5 пользователей, которые посетили разные места.И только 2 места посетили 5 пользователей.Поэтому я хочу получить 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

Но теперь мне нужен способ выяснить взаимные места.Есть идеи?

спасибо, смокинг

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Я не совсем знаком с синтаксисом sql для postgresql, но попробуйте это:

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

EDIT:

Вам нужно будет изменить «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
1 голос
/ 28 апреля 2011

Вы должны были бы придумать некоторые параметры для вашего поиска. Например, 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 голосов
/ 28 апреля 2011

в 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)

Вам нужно объединить свои столы, чтобы получить все места, где проводились мероприятия, в которых были пользователи. Когда вы только учитесь, иногда проще визуализировать его, если вы используете подзапросы. По крайней мере, это то, что я нашел для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...