首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP/sql调查问卷与适用性匹配

PHP/sql调查问卷与适用性匹配
EN

Stack Overflow用户
提问于 2013-02-20 00:35:56
回答 1查看 307关注 0票数 0

我正在开发一种解决方案,使用PHP和mySQL完成的问卷调查,将人们与他们可能感兴趣的某些东西进行匹配。基本上,用户回答问题,它创建用户的配置文件,然后将其与数据库中可能适合其个性的某些内容进行比较。它不是一个交友网站,但我猜它的工作原理类似于一个交友网站的工作方式,人们做一份问卷调查,它可以根据这些问卷以% match值匹配他们。

我已经开始开发这个,但我想我使用的方法可能不是最有效的。我希望你能根据你的最佳匹配来排序你的匹配。

有什么建议是最好的方法吗?

谢谢,德克兰

EN

回答 1

Stack Overflow用户

发布于 2013-02-20 00:42:35

将答案连接成一个字符串。如果它们是yes/ no,它看起来有点像二进制,但是如果你有>16和<100的选项,或者使用除法器等,那么使用其他数字,或者十六进制,或者对,也没有什么坏处。

为了找到最接近的匹配项,比较每个位置中的每个字符,并对结果进行排名。

=给定比较串中相同的字符数,例如"0101101001“

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
#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
    ');
}

如果您希望保留每个用户与其他用户之间的比较,则需要另一个表来存储user1、user2、match_rank。

您可能希望在getUsersByRank()中限制结果。

我并没有实际测试过它是否有效,只是把它写出来了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14962634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档