在最佳匹配上排序SQL查询

时间:2012-11-12 10:27:25

标签: php mysql sql database

我得到了一个从我的查询返回的结果列表,我希望在最佳匹配上订购。我将尽可能地保持清醒,但如果事情不够清楚,请告诉我,我会尽力使其更清楚。

用户已输入名为findsettings的设置列表。使用这些findsettings我正在搜索产品。这一切顺利,直到他应该找出最佳匹配。

有几个字段,例如min_review, max_price, allows_pets, etc

我想订购。例如,他需要先订购min_review of 40%,然后max_price = 10.00然后allows_pets = 0的产品。您可以使用OR执行此操作,但我希望也不会显示不安静匹配的结果,仅显示在列表的底部。所以基本上他应该首先展示最佳匹配,然后是第二个,第三个等,直到匹配最少的产品。

我不知道如何处理这个问题,所以我希望你能帮助我解决这个问题。

1 个答案:

答案 0 :(得分:7)

基本原则是为每条记录创建相关性分数,然后按此排序。

如果你希望每个标准具有相同的权重,在MySQL中你可以将每个布尔表达式加在一起(注意这是非标准的SQL-在其他RDBMS中你可能必须使用CASE来测试条件产生一个数字):

ORDER BY (review>=40/100) + (price<=10.00) + (allows_pets=0) DESC

如果标准的权重不同,您可以将每个表达式乘以其权重:

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) + 1*(allows_pets=0) DESC

和/或如果某些子集上匹配的那些始终始终而不考虑以后的结果,则可以划分ORDER BY子句:

ORDER BY 5*(review>=40/100) + 3*(price<=10.00) DESC,
         1*(allows_pets=0) DESC

如果您想在结果中看到相关性得分,可以类似地将上述任何表达式添加到SELECT(然后在ORDER BY子句中使用结果列,以避免写两次):

SELECT   *,
         (review>=40/100) + (price<=10.00) + (allows_pets=0) AS relevance,
FROM     my_table
ORDER BY relevance DESC

请注意,如果您想获取具有最接近某个目标的值的记录(例如min_review接近40%而非精确),您可以获取它与目标之间的(绝对?)差异值:

IF(review>=40/100, review-40/100, NULL)

但是,如果/当在一个标准中与其他人合并时,您必须小心对表达进行适当加权。