的毗连的答案为一个字符串。它看起来有点像二进制,如果他们是是/否,但使用其他数字或十六进制,或对,如果您有> 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()中。
我没有真正测试过这个工作,只是写出来。