gpt4 book ai didi

php - 在最佳匹配上订购 SQL 查询

转载 作者:可可西里 更新时间:2023-11-01 07:23:10 27 4
gpt4 key购买 nike

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

用户已经输入了一个名为findsettings 的设置列表。使用这些 findsettings 我正在搜索产品。这一切都很顺利,直到他应该去挑选出最好的匹配。

min_review、max_price、allows_pets等几个字段

我要订购。例如,他需要先订购 min_review 为 40% 的产品,然后是 max_price = 10.00,然后是 allows_pets = 0。您可以使用 OR 来做到这一点,但我希望不完全匹配的结果也显示在列表的底部。所以基本上他应该首先显示最佳匹配,然后是第二个、第三个等等,直到匹配最少的产品。

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

最佳答案

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

如果您希望每个条件具有相同的权重,在 MySQL 中您可以将每个 bool 表达式加在一起(请注意,这是非标准 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)

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

关于php - 在最佳匹配上订购 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13342035/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com