MySQL将排名最高与最低匹配的最佳方法是什么?

时间:2012-02-16 18:33:20

标签: mysql sql database search

我有一个我正在搜索的MySQL数据库。让我们说这是一个人的数据库。查询特定记录时,可以在每个属性上找到100%的匹配项。但是查询数据库以找到最接近的概率匹配(表属性上最接近的匹配)更多的是策略。

在这种情况下,创建临时表(非常类似于计数表)以指示哪些属性匹配/存在哪些属性是否有意义?在这样的数据库上进行高级搜索的典型方法是什么?

假设存储过程的示例(下面)

*参数只是为了举例说明我的搜索方式。我关注如何执行我的选择。问题是关于方法,策略,技术*

call FindPerson ("Brown Eyes", "Brown hair", "Height:6'1", "white", "Name:Joe" ,"weight180", "Age 34" "sex m");

RESULT TABLE
NAME  AGE HEIGHT WEIGHT HAIR  SKIN  sex  RANK_MATCH
Joe   32  6'1    180    Brown white m    1
Mike  33  6'1    179    Brown white m    2
James 31  6'0    179    Brown black m    3 

2 个答案:

答案 0 :(得分:2)

我的想法。您可以创建自己的分数并按其排序。像

这样的东西
SELECT `id`,
  (IF(`age`=32,1,0)+IF(`height`="6'1",1,0)+...) as  `score`
FROM `people`
HAVING `score` > 0
ORDER BY `score` DESC
LIMIT 10;

通过这种方式,您可以使用自己的比较处理每个字段,还可以通过添加12或更多来加权各个属性。 但我很安静,不确定,这是多么高效。

答案 1 :(得分:2)

我将使用的方法是创建一个评分函数(存储过程),评估给定输入与均值的标准距离。

在过程中,您将以类似于以下的方式判断每个标准:

INPUT AGE: 32
calculate MEAN of AGE WHERE (sex = m): 34.5
calculate STANDARD DEVIATION of AGE WHERE (sex = m): 2.5
calculate how many STDEVs 32 is from the 34.5 (also known as z-score): 1

对所有数值数据类型重复此过程,将它们相加并将ORDER BY相加。

这样做时,需要进行以下架构更改:高度从英尺/英寸形式更改为严格英寸。

根据您的需要,您可能还会考虑为性别和肤色/头发颜色设置任意比例。当然,您可能认为不应该考虑这些措施,因为它会大大改变评分函数。如果你选择的话,你必须找到一些可以添加到上面的SUM中的数字...但这很难,因为主格变量不能轻易转化为这些类型的东西。

如果您发现头发颜色/肤色能够有效地转换为连续色谱,那么您的得分数据将是相同的...输入的颜色值与均值和标准偏差的颜色值。

找到匹配项的查询将起到以下作用:

SELECT
 ABS(INPUT_AGE - AVG(AGE)) / STD(AGE) AS age_z,
 ABS(INPUT_WT - AVG(WT)) / STD(WT) AS wt_z,
...
 (age_z + wt_z + ...) AS score
FROM `table`
ORDER BY score ASC