Как посчитать похожие интересы в MySQL - PullRequest
5 голосов
/ 15 августа 2010

У меня есть 2 таблицы: «интересы» и «пользователи_интересы».

«пользователи_интересы» просто имеют поля userid и interestid.'интересы просто имеет id и name.

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

Кто-то сказал, что что-то вроде этого может работать:

SELECT 
      others.userid 
  FROM interests AS user 
  JOIN interests AS others 
      USING(interestid) 
  WHERE user.userid = 2 
  GROUP BY 
      others.userid 
  ORDER BY COUNT(*) DESC

Но у меняудачи с этим.

Ответы [ 2 ]

5 голосов
/ 15 августа 2010
SELECT ui.userid, COUNT(*) AS common_interests
FROM users_interests ui
WHERE ui.interestid IN (
    SELECT ui2.interestid FROM users_interests ui2 WHERE ui2.userid = 2
) 
AND ui.userid <> 2
GROUP BY ui.userid
HAVING common_interests > 3;

Обратите внимание, что userid мы основываем наш поиск (2) на двух местах в коде

2 голосов
/ 15 августа 2010

Вы сказали более 3 общих идентификаторов интересов , так что вы имеете в виду «по крайней мере 4», верно?

SELECT first1.userid, second1.userid
FROM users_interests first1, users_interests second1,
     users_interests first2, users_interests second2,
     users_interests first3, users_interests second3,
     users_interests first4, users_interests second4
WHERE
    first2.userid=first1.userid AND first3.userid=first1.userid AND first4.userid=first1.userid AND
    second2.userid=second1.userid AND second3.userid=second1.userid AND second4.userid=second1.userid AND
    first1.userid<>second1.userid AND
    first1.interestid=second1.interestid AND
    first2.interestid=second2.interestid AND first2.interestid<>first1.interestid AND
    first3.interestid=second3.interestid AND first3.interestid<>first2.interestid AND first3.interestid<>first1.interestid AND
    first4.interestid=second4.interestid AND first4.interestid<>first3.interestid AND first4.interestid<>first2.interestid AND first4.interestid<>first1.interestid

Поскольку я не проверял это, помните, чтов нем могут быть ошибки, поэтому используйте его, только если вы его понимаете.

Если вам нужно то же самое для других общих интересов, я уверен, что вы можете написать код для динамической генерации этого запроса для любогочисло.Кроме того, если вам нужны проценты names , я уверен, что вы сможете добавить необходимые четыре объединения в таблицу interests и добавить соответствующие столбцы в предложение SELECT.

...