Объединение на основе групп "по группам" - PullRequest
0 голосов
/ 29 сентября 2019

Итак, у меня есть таблица с именем Activities, которая содержит схему user_id, activity

. Для каждого пользователя есть строка со списком действий. Вот как это может выглядеть (добавлены пустые строки, чтобы на них было проще смотреть, пожалуйста, игнорируйте):

| user_id | activity  |
|---------|-----------|
| 1       | swimming  | -- We want to match this
| 1       | running   | -- person's activities
|         |           |
| 2       | swimming  |
| 2       | running   |
| 2       | rowing    |
|         |           |
| 3       | swimming  |
|         |           |
| 4       | skydiving |
| 4       | running   |
| 4       | swimming  |

Я бы хотел найти всех остальных пользователей с по крайней мере те же действия, что и для данного ввода id, чтобы я мог рекомендовать пользователей с аналогичными действиями.

поэтому в приведенной выше таблице, если я хочу найти рекомендуемых пользователей для user_id=1, запрос выдаст user_id=2 и user_id=4 потому что они участвуют в обоих swimming, running (и более), но не user_id=3, потому что они участвуют только в swimming

Так что результат с одним столбцом:

| user_id |
|---------|
| 2       |
| 4       |

- это то, что я в идеале искал бы


Что касается того, что я пробовал, я как бы застрял в том, как получить солидный набор действий user_id=1 дляматч против. В основном я ищу что-то вроде:

SELECT user_id from Activities
GROUP BY user_id
HAVING input_user_activities in user_x_activities

, где user1_activities - это просто набор действий нашего входного пользователя. Я могу создать этот набор, используя WITH input_user_activities AS (...) в начале. Я застрял в user_x_activities part

Есть мысли?

Ответы [ 2 ]

1 голос
/ 29 сентября 2019

Чтобы получить пользователей с одинаковыми действиями, вы можете использовать самостоятельное присоединение. Позвольте мне предположить, что строки уникальны:

select a.user_id
from activities a1 join
     activities a
     on a1.activity = a.activity and
        a1.user_id = @user_id
group by a.user_id
having count(*) = (select count(*) from activities a1 where a1.user_id = @user_id);

Предложение having отвечает на ваш вопрос - получить пользователей, которые выполняют те же действия, что и данный пользователь.

0 голосов
/ 29 сентября 2019

Вы можете легко получить все пользователи, упорядоченные по сходству, используя JOIN (который находит все общие строки) и GROUP BY (для суммирования сходства по user_id) и, наконец, ORDER BY, чтобы сначала вернуть наиболее похожих пользователей. .

SELECT b.user_id, COUNT(*) similarity
FROM activities a
JOIN activities b
  ON a.activity = b.activity
WHERE a.user_id = 1 AND b.user_id != 1
GROUP BY b.user_id
ORDER BY COUNT(*) DESC

SQLfiddle для тестирования с .

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