SQL: возвращать строки, основанные на парах ячеек с общими значениями - PullRequest
0 голосов
/ 04 мая 2019

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

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

КОД ТАК FAR:

SELECT me.followed, me.following, me.interest FROM 
    (SELECT followed, following, interest
    FROM follow JOIN interest
    WHERE followed = interest.user_id
    ORDER BY followed) AS me
INNER JOIN follow AS you ON me.following = you.followed
WHERE me.followed = you.following

[таблица] https://i.imgur.com/t68T4OI.png

 A   B C 
 2   1 2 
 2   1 6 
 2   1 9 
 1   2 1 
 1   2 7 
 1   2 8 
 7  15 1 
 7  15 7 
 15  7 2
 15  7 7 

(A = следит, B = следит, C = интерес пользователя) Извините за форматирование, похоже, не существует простого способа создания таблиц.

Моя таблица пока показывает, что пользователь 2 следует за пользователем 1, а пользователь 1 следует за пользователем 2. То же самое для пользователей 15 и 7. Он также показывает, что пользователь 2 заинтересован в интересе 2, интересе 6 и интересе 9.

Я хочу написать некоторый код, который должен просто возвращать пользователя 7 и пользователя 15, поскольку они являются единственными пользователями, которые следуют друг за другом и имеют общий интерес (интерес 7), но я не уверен, с чего начать.

Ответы [ 3 ]

2 голосов
/ 04 мая 2019

Я не знаю, если я неправильно понял, но можно ли ответить на этот запрос только таблицей user_follow?

SELECT * FROM
  user_follow a 
  INNER JOIN 
  user_follow b
  ON
    a.followed_user_id = b.following_user_id AND
    a.following_user_id = b.followed_user_id AND
    a.interest_id = b.interest_id
1 голос
/ 04 мая 2019

Вам нужно еще одно присоединение к user_interest:

SELECT me.followed_user_id, me.following_user_id, 
   me.interest_id AS 'same interest id'
FROM user_follow AS me
JOIN user_follow AS you -- me and you follow each other
  ON me.following_user_id = you.followed_user_id
 AND me.followed_user_id = you.following_user_id
JOIN user_interest AS me_int -- my interest
ON me.following_user_id = me_int.user_id
JOIN user_interest AS you_int -- your interest
  ON me.followed_user_id = you_int.user_id
 AND me_int.interest_id = you_int.interest_id --must be the same
0 голосов
/ 04 мая 2019

Если бы я писал этот запрос, я хотел бы получить набор результатов, в котором пары пользователей появляются только один раз и общее количество интересов совпадает.

Итак:

select uf.followed_user_id, uf.following_user_id,
       count(*) as interests_in_common
from user_follow uf join
     user_interest uifed
     on uifed.user_id = uf.followed_user_id join
     user_interest uifing
     on uifing.user_id = uf.followed_user_id and
        uifing.interest_id = uifed.interest_id
where (uf.followed_user_id, uf.following_user_id) in
          (select uf2.following_user_id, uf2.followed_user_id
           from user_follow uf2
          ) and
      uf.followed_user_id < uf.following_user_id
group by uf.followed_user_id, uf.following_user_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...