当前位置: 首页 > 面试题库 >

订购最匹配的SQL查询

饶谦
2023-03-14
问题内容

我从查询中返回了要按最佳匹配顺序进行排序的结果列表。我会尽我所能地保持清晰,但是如果某些事情还不够清晰,请告诉我,我将尝试使其更加清晰。

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

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

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

我不确定该如何处理,因此希望您能帮助我解决该问题。


问题答案:

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

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

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)

但是,如果在单个条件下与其他表达式结合使用,则必须谨慎权衡表达式的权重。



 类似资料:
  • 问题内容: 我有以下查询: 是否有根据最相关结果进行分类的策略? 问题答案: 当谈论“相关性”时,您确实想要自然语言搜索,这是MySQL全文搜索支持的。语法是比正常的不同 一样 的查询,你需要一个特殊的索引添加到表中,但排序按相关性可能是这样。 这是MySQL计算相关性的方式(来自链接): 如前面的示例所示,在WHERE子句中使用MATCH()时,返回的行将自动按照相关性最高的顺序进行排序。相关性

  • 问题内容: 我真的很不擅长SQL,我想知道我可以使用哪种SQL解决这个问题,在这个问题以下我怀疑是NP完全问题,但是我认为查询需要很长时间才能在大型数据集上运行因为这将作为后台任务完成。首选标准sql语句,但是如果需要存储过程,则使用它。SQL必须在Postgres 9.3上运行。 问题:给定一组包含一组关键字的文章,请为每条包含最多匹配关键字的文章查找前n条文章。 文章表的精简版本如下所示: 这

  • 问题内容: 我目前有使用PIVOT生成如下表的查询: 我想做的是,但看起来像是拉伸,结果是值递减。 这是查询: 这样做会产生错误,因此可以指定列吗? 问题答案: 试试这个:

  • 问题内容: 我在编写sql以从表中获取可用房间时遇到问题。我的表结构如下。 表:预订 桌子:房间 包含有关房间的详细信息,该表的主键是room_id,它具有1至10个房间,共10个房间。 我的问题是我想知道这些房间在2012年9月14日6:00 pm至21-09-2012 9:00 am之间可用,这意味着我应该只将room_id的结果作为1,3,5,7,8 ,9,10。 有人可以帮我编写SQL来从

  • 问题内容: 我有一个与数据库对话的servlet,然后返回一个有序(按时间排序)对象的列表。在servlet部分,我有 从日志中,我可以看到数据库以正确的顺序返回了User对象。 在前端,我有 但是顺序改变了。 我只在返回的列表很大(超过130个用户)时才注意到这一点。 我尝试使用Firebug进行调试,Firebug中的“响应选项卡”显示列表的顺序与servlet中的日志不同。 我做错了什么吗?

  • 问题内容: 我想抢购10种订购最多的产品。我的表看起来像这样: 产品 订购产品 命令 目前,我有以下几点: 我在上面的查询中已经指出,我不确定该放置什么。如何按订购产品表中显示的产品数量订购产品? 问题答案: 它将给您10个项目,每个项目都包含产品对象,以及numberOfOrders整数。 编辑 : 由于这将作为方法的返回值,并且由于C#不允许返回匿名类型(因此C.4.0中仍具有此功能),因此您