加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 在最佳匹配上排序SQL查询

发布时间:2020-12-13 17:43:04 所属栏目:PHP教程 来源:网络整理
导读:我得到了一个从我的查询返回的结果列表,我想在最佳匹配上订购.我会尽量保持清醒,但如果事情不够清楚,请告诉我,我会尽力使其更清楚. 用户已经输入了一个名为findsettings的设置列表.通过这些发现,我正在寻找产品.这一切顺利,直到他应该找出最佳匹配. 有几个字
我得到了一个从我的查询返回的结果列表,我想在最佳匹配上订购.我会尽量保持清醒,但如果事情不够清楚,请告诉我,我会尽力使其更清楚.

用户已经输入了一个名为findsettings的设置列表.通过这些发现,我正在寻找产品.这一切顺利,直到他应该找出最佳匹配.

有几个字段,如min_review,max_price,allows_pets等.

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

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

解决方法

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

如果你希望每个标准具有相同的权重,在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)

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读