从表中获取每个条目组合的公共连接

时间:2016-10-22 12:23:44

标签: mysql sql

我有一个用户名和用户名的用户表。 另一个表有一个兴趣列表,包括interestid和name。 第三个表是一个连接表,带有userid和interestid。

对于每对用户,我想得到他们共同感兴趣的数量。我尝试了很多东西,最近的是:

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 个答案:

答案 0 :(得分: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;

注意:此版本仅为两个用户带回ID并且只返回一对:(a,b)但不是(b,a)。

现在,如果您想要包含没有共同兴趣的用户对,这会变得更加棘手。如果是这样,您需要首先使用cross join生成用户对并引入兴趣:

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;