我有一个用户名和用户名的用户表。 另一个表有一个兴趣列表,包括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
我无法对此进行有效的查询。有什么帮助吗?
答案 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;