2010-08-14 58 views
5

我有2个表,'interest'和'users_interests'。如何计算MySQL中的类似兴趣点

'users_interests'只有useridinterestid字段。 的兴趣只有一个id和一个name

我只需要找到具有超过3个利息ID的userid's共同点。我被告知有一个自我加入参与,但我似乎无法得到这个工作。

有人说这样的事情可以工作:

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 

但我与它有没有运气。

回答

5
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; 

注意两个地方,我们正在对我们的基础搜索userid2)的代码的发生

+0

惊人!谢谢你,这个作品非常漂亮! – Ryan 2010-08-15 07:21:09

2

你说共有3个以上的利息ID,所以你的意思是“至少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 

因为我没有测试过这个,请记住它可能有错误,所以只有在你理解的时候才使用它。

如果您需要相同的其他数量的共同兴趣,我相信您可以编写代码来动态生成任何数量的查询。另外,如果您需要名称,我相信您可以将必要的四个连接添加到interests表中,并将相关列添加到SELECT子句中。