2013-02-19 20 views
0

我正在开发一种解决方案,用于将人们与他们可能感兴趣的某些东西进行匹配,以使用使用PHP和mySQL完成的调查问卷。基本上,用户回答问题,创建用户档案,然后将其与数据库中可能适合他们个性的特定事项进行比较。这不是一个约会网站,但我想它的工作方式类似于约会网站的工作方式,人们可以在其中进行问卷调查,并且可以根据这些匹配值与匹配值进行匹配。PHP/sql问卷调查和适合性匹配

我已经开始开发这个,但是我正在考虑我使用的方法可能不是最高效的。我希望你能根据你最好的比赛来分类比赛。

任何建议这样做的最佳方法是什么?

感谢, 德克兰

回答

1

的毗连的答案为一个字符串。它看起来有点像二进制,如果他们是是/否,但使用其他数字或十六进制,或对,如果您有> 16和< 100选项,或使用分频器等没有伤害

要查找最接近的匹配比较每个位置中的每个字符并对结果进行排名。

rank =给定比较字符串(例如, “0101101001”

0101101001 against 0101101001 gives a rank of 10 
0101101001 against 1101101001 gives a rank of 9 
0101101001 against 1111111001 gives a rank of 7 
0101101001 against 0001100111 gives a rank of 6 

由于SQL

table `yesno` 
| user_id | answers | 
| 1 | 0101101001 | 
| 2 | 1101101001 | 
etc 

SELECT answers, 
    (#looking for 0101101001 
    IF (substring(answers,1,1)=0, 1, 0) 
    + IF (substring(answers,2,1)=1, 1, 0) 
    + IF (substring(answers,3,1)=0, 1, 0) 
    + IF (substring(answers,4,1)=1, 1, 0) 
    + IF (substring(answers,5,1)=1, 1, 0) 
    + IF (substring(answers,6,1)=0, 1, 0) 
    + IF (substring(answers,7,1)=1, 1, 0) 
    + IF (substring(answers,8,1)=0, 1, 0) 
    + IF (substring(answers,9,1)=0, 1, 0) 
    + IF (substring(answers,10,1)=1, 1, 0) 
    ) 
AS rank 
FROM yesno 
ORDER BY 
    (#looking for 0101101001 
    IF (substring(answers,1,1)=0, 1, 0) 
    + IF (substring(answers,2,1)=1, 1, 0) 
    + IF (substring(answers,3,1)=0, 1, 0) 
    + IF (substring(answers,4,1)=1, 1, 0) 
    + IF (substring(answers,5,1)=1, 1, 0) 
    + IF (substring(answers,6,1)=0, 1, 0) 
    + IF (substring(answers,7,1)=1, 1, 0) 
    + IF (substring(answers,8,1)=0, 1, 0) 
    + IF (substring(answers,9,1)=0, 1, 0) 
    + IF (substring(answers,10,1)=1, 1, 0) 
    ) 
DESC 

由于PHP

#usage $rs=getUsersByRank("0101101001"); 

function getUsersByRank($lookslike) { 
    /* expects "binary" string 
    returns user_id, answers and rank (0 to string length) ordered by closest match first 
    */ 

    $ifs=array(); 
    foreach (str_split($lookslike) as $i=>$bit){ 
     $ifs[]='IF (substring(answers,' . ($i+1) . ',1)=' . $bit . ', 1, 0) '; 
    } 

    // use your db class 
    return $db->select_many(' 
     SELECT user_id, answers, 
      ('. implode(' + ', $ifs) .') 
     AS rank 
     FROM yesno 
     ORDER BY 
      ('. implode(' + ', $ifs) .') 
     DESC 
    '); 
} 

如果你想保持每个用户的比较,你会需要另一个表来存储用户1,用户2 match_rank与每个其他用户。

您可能想将结果限制在getUsersByRank()中。

我没有真正测试过这个工作,只是写出来。