4

我得到了一个从我的查询返回的结果列表,我想按最佳匹配排序。我会尽量说清楚,但如果有些地方不够清楚,请告诉我,我会尽量让它更清楚。

用户已经输入了一个名为 的设置列表findsettings。有了这些findsettings,我正在寻找产品。这一切都很顺利,直到他应该去整理出最好的比赛。

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

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

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

4

1 回答 1

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)

但是,如果/在单个标准中与其他表达式组合时,您必须小心适当地加权您的表达式。

于 2012-11-12T11:02:54.300 回答