【问题标题】:Mysql matching getting users with either similiar interest or same gender for each userMysql匹配为每个用户获取具有相似兴趣或相同性别的用户
【发布时间】:2015-10-18 11:24:08
【问题描述】:

我正在尝试根据“userinterest”表中的相同“interestid”优先为“users”表中的每个用户获取三个匹配的用户,如果用户没有兴趣,那么如果他的“性别”与其他用户匹配,那么获取其中三个用户的用户 ID。

User 表有 userid 和 gender,而 userinterest 表有两列 u_id 和 interest_id,其中 u_id 是 userid。

每个用户可能有多个兴趣,但即使一个兴趣匹配,我们也可以选择该用户。

我正在寻找的结果类型是两列,第一列带有我们正在获取结果的用户 ID,另一列带有连接三个用户 ID 的组。

 12 | 32,34,23  
 13 | 33,35,23  
 14 | 22,35,37    

【问题讨论】:

  • 请编辑您的问题并提供示例数据和所需结果。
  • 尽量不要混淆数据检索问题(mysql部分)和数据显示问题(php部分)

标签: php mysql


【解决方案1】:

您可以使用聚合查询来获取两个用户的共同兴趣数量:

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;

【讨论】:

  • 首先非常感谢您的帮助!实际上我尝试了我的方法,但问题是它非常慢并且导致 sql 负载。只是提到我不想要最常见的用户;即使一个兴趣匹配,我也可以接受该用户。很抱歉打扰你,但有没有我可以让它更快?关于我是否不寻找最常见的用户而只寻找一个兴趣匹配并添加?
  • 如果您能帮助我,请再做一件事。您的查询对我来说效果很好。如果我不需要匹配的组连接,那么这个查询将如何改变。请帮忙。
  • @user3881111 。 . .只需运行子查询。
猜你喜欢
  • 1970-01-01
  • 2020-04-21
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 2013-08-26
相关资源
最近更新 更多