2011-10-11 43 views
1

目前我工作的一个项目,我需要根据自己喜欢的食物的种类相匹配的人:咨询我的算法来匹配人

这是情景:

我有一个列表用户和他们最喜欢的食物在我的数据库中。数据库结构如下:

USERS(id,name,email,gender,dob) 
Fav_Food (id,user_name,food,desc) 

数据为用户表:

1,翘,[email protected],女性,2010 10月11日

2,鲍勃,鲍勃@ lala.com,男性,2010

3,杰森,[email protected],男性,2010 10月13日

数据为fav_foods标签10月12日勒:

1,爱丽丝,苹果,一些降序

2,翘,香蕉,一些降序

3,爱丽丝,水滴形,一些降序

4,鲍勃,苹果,一些说明

5,鲍勃,蛋黄派,一些递减

6,杰森,香蕉,一些递减

6,杰森,苹果,一些desc

想象一下,我是爱丽丝,我喜欢苹果,香蕉&梨。我如何能够根据最喜爱的食物来匹配人们?例如,我首先检查是否有人喜欢苹果,香蕉和梨(含三个)和比只有两个组合(apple,banana)(apple,pear)(banana,pear)(banana,apple)置换去....等等.....

想象它像一个维恩图,其中的互动是我感兴趣的。我有兴趣推荐最匹配的用户。有没有可用的算法,我可以使用PHP?

+1

看看“Jaccard系数”,用它可以测量两个给定事物的相似度。 – deceze

+0

我正在阅读它,但不知道如何与数据列表一起工作...嗯, – madi

回答

3

你可以做的是加入fav_foods表本身再算上比赛:

SELECT u2.user_name,count(*) as likeness 
FROM `fav_food` as u1 INNER JOIN `fav_food` as u2 ON (u1.user_name = 'alice' AND 
               u1.food = u2.food AND 
               u2.user_name != "alice") 
GROUP BY u2.user_name 
ORDER BY likeness DESC 

它会输出:

user_name likeness 
jason  2 
bob   1 

,关键是在内部的条件加入。 .. =)

希望这会有所帮助

EDITED:oops我更正了查询=)

1

就我个人而言,我会让一个用户HABTM食物关系,而不是一遍又一遍地存储相同的字符串。

其次,look here for a good explanation of Jaccard coefficient

如果你决定去与一个HABTM关系,看看这个文档:http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM页面上的最后一个例子可能是最有趣的给你。

您可以在飞行中使用绑定来获取所有拥有苹果和香蕉作为喜爱食物的用户。

或者您可以只获取所有用户及其食物,并使用Jaccard系数进行比较。

只是抛出一些可能性,希望它有帮助!