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
.
按较高百分比匹配检查 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
.