получение общих соединений для каждой комбинации записей из таблицы

#mysql #sql

#mysql — сервер #sql #mysql

Вопрос:

У меня есть таблица пользователей с идентификатором пользователя и именем пользователя. В другой таблице есть список интересов с идентификатором интереса и именем. Третья таблица — это таблица соединений с идентификаторами пользователя и интереса.

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

 SELECT u1.username AS me, u2.username AS you, COUNT(j.interestid) AS commoninterests
FROM users u1, users u2
INNER JOIN interests_join j
    ON u1.id = j.id
WHERE u1.id != u2.id
GROUP BY u1.name
  

Я просто не могу получить рабочий запрос по этому поводу. Любая помощь?

Ответ №1:

Это самосоединение на interests_join :

 select ij1.userid, ij2.userid, count(*)
from interests_join ij1 join
     interests_join ij2
     on ij1.interestid = ij2.interestid and
        ij1.userid < ij2.userid
group by ij1.userid, ij2.userid;
  

Примечание: эта версия возвращает только идентификаторы и только одну пару для двух пользователей: (a, b), но не (b, a).

Теперь это становится сложнее, если вы хотите включить пары пользователей, у которых нет общих интересов. Если это так, вам нужно сначала сгенерировать пары пользователей, используя cross join и the, чтобы указать интересы:

 select u1.username, u2.username, count(ij2.userid)
from users u1 cross join
     users u2 left join
     interests_join ij1 
     on ij1.userid = u1.userid left join
     interests_join ij2
     on ij2.userid = u2.userid and
        ij1.interestid = ij2.interestid 
group by u1.username, u2.username;
  

Комментарии:

1. Второе — это то, что мне нужно, но оно выдает ошибку для меня =[

2. это была моя ошибка, я не читал перед копированием и вставкой, и некоторые из моих имен переменных отличались. итак, теперь это дает результат, просто неправильный результат. это показывает, что пользователь 2 имеет 1 общий интерес с самим собой (верно; у нее есть 1 интерес), но имеет 2 общих с пользователем 1 (как это возможно, если у нее только 1 интерес)?

3. nvermind — нашел проблему, был дубликат для интереса пользователя 1, спасибо