您可以使用聚合查询来获取两个用户的共同兴趣数量:
select ui.user, ui2.user as otherUsaer, count(*) as numInterests
from userinterest ui join
userinterest ui2
on ui.interest = ui2.interest and ui.user <> ui2.user
group by ui.user, ui2.user;
然后您可以重新聚合它以获得每个用户最常见的三个用户:
select user, substring_index(group_concat(otherUser order by numInterests desc), ',', 3) as top3
from (select ui.user, ui2.user as otherUsaer, count(*) as numInterests
from userinterest ui join
userinterest ui2
on ui.interest = ui2.interest and ui.user <> ui2.user
group by ui.user, ui2.user
) uu
group by user;
这假设您没有太多用户;否则,用于substring_concat() 的中间字符串缓冲区将溢出。 (可以扩展默认缓冲区长度。)使用变量的替代方案更难编码。
我还建议您避免考虑性别。如果确实是兴趣,则将其添加到兴趣表中。但是,您可以通过以下方式添加性别:
select user, substring_index(group_concat(otherUser order by numInterests desc), ',', 3) as top3
from (select ui.user, ui2.user as otherUsaer,
(count(*) + (u.gender = u2.gender)) as numInterests
from userinterest ui join
userinterest ui2
on ui.interest = ui2.interest and ui.user <> ui2.user join
user u
on ui.user = u.user join
user u2
on ui2.user = u2.user
group by ui.user, ui2.user
) uu
group by user;