从n列中选择最高匹配结果

时间:2015-12-20 10:02:57

标签: mysql partitioning

按更高的百分比匹配顺序检查30列mysql

我想制作个人资料匹配项目。目标是返回100个结果,首先匹配更好的百分比。风景是 -

A user has yes or no answer of 30 questions(all answered).
User is interested to see 100 people who has matching with him order by higher percentage

我需要建议决定如何制作表格和查询以确保最小的处理负荷 -

我应该将答案存储在不同的列中(每列中的值是/否)还是用逗号分隔的同一列(只有答案有教养,高,富,单,关怀)?

表A和表B的查询应该按百分比返回最高匹配顺序。

这是表格(30个固定问题的答案,是/否类型答案)

.id | name | q01 | q02 | q03 | q04 | q05 | q06 |...continue...| q30

11 .|. tom ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1

12 .|. mik ..|.. 0 ..|.. 0 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|..... ............. |. 0

13 .|. jim ...|.. 1 ..|.. 1 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1

14 .|. don ..|.. 0 ..|.. 1 ..|.. 1 ...|.. 0 ..|.. 0 ..|.. 0 ..|..... ............. |. 1

15 .|. ric ....|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 0

16 .|. jam ..|.. 0 ..|.. 1 ..|.. 0 ...|.. 0 ..|.. 0 ..|.. 0 ..|..... ............. |. 1

17 .|. joe ...|.. 1 ..|.. 1 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|..... ............. |. 1

18 .|. ima ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 1

19 .|. sun ..|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|..... ............. |. 0

20 .|. dim ..|.. 0 ..|.. 0 ..|.. 1 ...|.. 1 ..|.. 0 ..|.. 0 ..|.... .............. |. 0

21 .|. dic ...|.. 1 ..|.. 0 ..|.. 0 ...|.. 1 ..|.. 0 ..|.. 1 ..|.... .............. |. 1

xx .|. yyy ...|.. up to fifty thousand rows.. ...... |....................|. 

X user (example:id 15)希望得到100个与他最佳匹配的结果(q01到q30列匹配)。匹配的最高百分比应首先返回。

请帮我查询

  

SELECT * FROM表WHERE条件ORDER BY匹配条件LIMIT   0100

我需要什么条件?

1 个答案:

答案 0 :(得分:0)

  • 完美匹配:

在这种情况下,您应该创建每个答案列,手动创建此位图(每个问题1位)。在此列上创建索引。

表格如下:

user_id  q1   q2 ... qn  accumulator (>n bits)
1          red  no     yes 100110101 
  • 近似匹配:

如果使用位图索引,则必须搜索密钥的所有x位变体。其中x / Number_of_questions * 100是最小百分比。

EX:1位变化键:从101开始,您将拥有001,111,100。

如果不同的问题具有不同的权重,则无法在应用程序级别将其考虑在内。

如果问题编号不是静态的(如果您以后可能想要添加或删除问题),我建议您对答案表进行规范化。这取决于存储引擎(不应该是MongoDB的问题)。

同样,使用累加器,表应如下所示:

user_id answer_id  accumulator (>n bits)
1       1          100110101 

现在,当您搜索时,您将对结果进行异或并按此排序。

SELECT * FROM answers ORDER BY BIT_COUNT(myAnswer ^ accumulator) ASC;