Select 来自 n 列的最高匹配结果

Select highest matching results from n columns

按较高百分比匹配检查 30 列排序 mysql

我想做一个资料匹配项目。目标是 return 说 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

我需要建议来决定如何进行 table 和查询以确保最小处理负载 -

我应该将答案存储在单独的列中(每列中的值为 yes/no)还是在用逗号分隔的同一列中(只有“是”的答案受过教育、高大、富有、单身、有爱心)?

Table A 和 Table B 到 return 最高匹配顺序的查询应该是什么百分比。

这是 Table(30 个固定问题的答案,yes/no 输入答案)

.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 列)。最高百分比的匹配应该 return 首先。

请帮我查询

SELECT * FROM table WHERE condition ORDER BY matching condition LIMIT 0,100

我需要什么条件?

  • 完美匹配:

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

Table 应如下所示:

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。

如果不同的问题有不同的权重,你不能在应用层面考虑到这一点。

我建议您标准化您的答案 table 以防问题编号不是静态的(以防您以后可能想添加或删除问题)。这取决于存储引擎(MongoDB 应该不是问题)。

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

user_id answer_id  accumulator (>n bits)
1       1          100110101 

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

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

如果您有 INT UNSIGNED 而不是 30 列,其中 30 个 0/1 值表示 no/yes,...

BIT_COUNT(XOR(col, to_match_against))

表示有多少位不同意

据此,您可以从 30 中减去并除以 30 再乘以 100 得到百分比 同意。然后ORDER BY.