MySQL多重利益匹配问题

dan*_*age 3 mysql loops for-loop

我有一个用户输入他们兴趣的数据库.我想找到兴趣相符的人.

兴趣表的结构是

interestid | username | hobby | location | level | matchinginterestids

让我们两个用户保持简单.

  • 用户Joe可能有10个不同的兴趣记录
  • 用户greg可能有10个不同的兴趣记录.

我想做以下算法

  • 以Joe的兴趣记录1为例,从兴趣数据库中寻找匹配的爱好和位置.将任何匹配的兴趣ID放在匹配字段中.然后去乔的兴趣记录2等.

我想我需要的是某种for循环,它将循环遍历所有joe的片段,然后每次在兴趣数据库中找到匹配时进行更新.这在MySQL中甚至可能吗?


进一步举例:

我是丹.我有3个兴趣.每个兴趣由3个科目组成:

  • 丹猫,营养,头发
  • Dan superlens,dna,显微镜
  • 丹电影,慢动作,fightscenes

其他人可能有其他兴趣

乔:

  • 乔猫,营养,力量
  • Joe superlens,dna,显微镜

  • Moe mysql,查询,php
  • 萌电影,specialfx,相机
  • Moe superlens,dna,显微镜

现在,当我以Dan身份登录时,我希望查询返回以下内容:

以下是您的兴趣匹配:

---有兴趣猫营养头发
Joe对猫和营养
感兴趣Joe和Moe对superlens,dna,显微镜
感兴趣Moe对电影感兴趣

查询需要遍历Dan的所有兴趣,并比较3,2,1个主题匹配.

我可以从循环中在php中执行此操作,但它会一直调用数据库来获取结果.我想知道是否有一种狡猾的方式使用单个查询来完成它或者可能是3个单独的查询,一个查找3个匹配,一个用于2,一个用于1.

eyk*_*nal 5

对于MySQL来说这绝对是可能的,但我认为你可能会以一种尴尬的方式解决这个问题.我将从结构化表开始,如下所示:

TABLE Users ( userId, username, location )
TABLE Interests( interestId, hobby )
TABLE UserInterests( userId, interestId, level )
Run Code Online (Sandbox Code Playgroud)

当用户添加兴趣时,如果之前没有添加兴趣,则将其添加到Interests表中,然后将其添加到UserInterests表中.当您想要检查其他具有相似兴趣的人时,您可以简单地查询该UserInterests表以查找具有相似兴趣的其他人,这些人已经为您提供了所有相关信息:

SELECT DISTINCT userId
  FROM UserInterests
  WHERE interestId IN (
     SELECT interestId
       FROM UserInterests
       WHERE userId = $JoesID
     )
Run Code Online (Sandbox Code Playgroud)

这可能是在没有子查询的情况下以更优雅的方式完成的,但这就是我现在想到的.