2012-04-29 2 views
3

나는 사용자가 거의 동일한 아티스트를 좋아하는 사용자를 찾을 수있는 음악 웹 사이트를 만들고 있습니다.두 결과 세트 사이의 유사점 비교

나는 'id_user', 'id_artist'의 2 개의 열을 가진 'like'테이블을 가지고 있습니다. 그 두 사용자가 같은 4 예술가가

User 1 likes: 
1, 12 
1, 13 
1, 14 
1, 26 
1, 42 
1, 44 

User 2 likes: 
2, 13 
2, 14 
2, 15 
2, 26 
2, 42 
2, 56 

: 는 여기에 내가이 일을하고자하는 방법의 예입니다. 데이터베이스에서 가장 유사한 사람들을 찾기 위해 두 결과 세트를 비교하는 방법이 있습니까?

첫 번째 아이디어는 문자열에서 "12,13,14,26,42,44"와 같이 선호도를 연결하고 mysql FULLTEXT 점수를 사용하여 다른 문자열을 비교하는 것입니다. 그게 작동하지 않았다 ... 이유는 모르겠지만 mysql fulltext는 텍스트에서만 작동합니다 ... 숫자가 아닙니다 ...

어떤 생각이나 단서가 많이 감사 할 것입니다. 이 같은

답변

2

뭔가이 매우 효율적 아니라고

SELECT first_user.id_user, second_user.id_user, COUNT(first_user.id_user) AS total_matches 

FROM likes AS first_user 

JOIN likes AS second_user 
ON second_user.id_artist = first_user.id_artist 
AND second_user.id_user != first_user.id_user 

GROUP BY first_user.id_user, second_user.id_user 

ORDER BY total_matches DESC 

LIMIT 1 

참고. 이 문제를 해결하는 한 가지 방법은 LIMIT 1 부분이 제거 된이 쿼리의 출력을 포함하는 '캐시 테이블'을 만드는 것입니다. 관련 인덱스를 추가하고이 캐시 테이블을 쿼리하십시오. cron 작업을 설정하여이 테이블을 주기적으로 업데이트 할 수 있습니다.

예 :

CREATE TABLE IF NOT EXISTS `likes` (
    `id_user` varchar(50) DEFAULT NULL, 
    `id_artist` varchar(50) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

INSERT INTO `likes` (`id_user`, `id_artist`) VALUES ('8', '39'), ('8', '37'), ('4', '37'), ('8', '24'), ('8', '7'), ('4', '28'), ('8', '28'), ('4', '27'), ('4', '11'), ('8', '49'), ('4', '7'), ('4', '40'), ('4', '29'), ('8', '22'), ('4', '29'), ('8', '11'), ('8', '28'), ('4', '7'), ('4', '31'), ('8', '42'), ('8', '25'), ('4', '25'), ('4', '17'), ('4', '32'), ('4', '46'), ('4', '19'), ('8', '34'), ('3', '32'), ('4', '21') 

+---------+---------+---------------+ 
| id_user | id_user | total_matches | 
+---------+---------+---------------+ 
| 8  | 4  |    7 | 
+---------+---------+---------------+ 
+0

도움을 주셔서 감사합니다. 검색어가 chram처럼 작동합니다. – MonsieurNinja

+0

@sikko 도와 드리겠습니다! 귀하의 프로젝트와 함께 행운을 빈다 :) –

0

그 자체로 테이블을 가입 할 수있다. (쿼리가 모호하지 않도록 테이블의 두 "복사본"중 적어도 하나에 대한 별칭을 지정해야합니다.)

두 명의 사용자가 있다고 가정하면 공통점이있는 "좋아요"를 찾을 수 있습니다. like 테이블 조인을 자체적으로 수행하면됩니다. 또한 왼쪽 조인을 수행하고 몇 개의 결과가 있고 얼마나 많은 결과가 null인지 계산하여 사용자 1이 좋아하는 사용자의 비율을 사용자 2가 공유 할 수 있습니다. 이것은 대칭 연산이 아니므로 숫자 중 하나 또는 둘 모두가 0 인 경우를 처리해야합니다.

"데이터베이스에서 가장 유사한 사람 찾기"를 원하면 다음을 수행 할 수 있습니다. 모든 사용자 쌍에 대해이 작업을 수행하지만 n 명의 사용자가있는 경우 n*(n-1)/2 개의 비교를 수행해야하며 이는 n의 제곱입니다. 많은 사용자가있는 경우 데이터베이스에서 수행해야 할 작업이 많을 수 있습니다.