按更高的百分比匹配顺序检查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
我需要什么条件?
答案 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;