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

Count和Order By Where子句匹配

濮阳霄
2023-03-14
问题内容

我正在为FAQ列表编写一些非常简单的搜索功能。我正在将搜索字符串拆分为各种字符,包括空格。然后根据以下内容执行选择

SELECT *
FROM "faq"
WHERE
    ((LOWER("Question") LIKE '%what%'
   OR LOWER("Question") LIKE '%is%'
   OR LOWER("Question") LIKE '%a%'
   OR LOWER("Question") LIKE '%duck%'))

我不得不对其进行稍微的编辑,使其由我们的数据访问层生成,但是它应该使您对发生的事情有所了解。

上面的查询很好地说明了这个问题,因为大多数问题中可能都包含单词a或is,但是我无法将其过滤掉,因为首字母缩略词对搜索者而言很重要。建议的是,我们根据匹配关键字的数量进行排序。但是,我一直找不到在SQL中执行此操作的方法(我们没有时间用关键字等的索引来创建简单的搜索引擎)。有谁知道是否有一种方法可以计算SQL语句中LIKE匹配的数量并以此排序,以使关键字最多的问题出现在结果的顶部?


问题答案:

我假设匹配的关键字列表是由用户输入的,并且在执行查询之前由应用程序动态地插入到查询中。如果是这样,我建议像这样修改查询:

SELECT *
FROM "faq"
WHERE
    ((LOWER("Question") LIKE '%what%'
   OR LOWER("Question") LIKE '%is%'
   OR LOWER("Question") LIKE '%a%'
   OR LOWER("Question") LIKE '%duck%'))
order by
    case when LOWER("Question") LIKE '%what%' then 1 else 0 end +
    case when LOWER("Question") LIKE '%is%' then 1 else 0 end +
    case when LOWER("Question") LIKE '%a%' then 1 else 0 end +
    case when LOWER("Question") LIKE '%duck%' then 1 else 0 end
descending;

假设用户(或算法)可以为每个选择项分配权重,这甚至可以使您“加权”每个选择项的重要性。

一个警告:如果您的查询是动态构建的,您是否意识到SQL插入
攻击的风险?



 类似资料:
  • 问题内容: 这是我的代码: 在BOL的此页面上,Microsoft说: 如果未指定PARTITION BY,则该函数会将查询结果集的所有行都视为一个组。 因此,根据我的理解,最后的陈述将给我以下结果。由于所有记录都被视为一个组,对吗? 但是实际结果是: 任何人都可以帮助解释为什么?谢谢。 问题答案: 它给出了一个正在运行的总数(此功能直到2012版才在SQL Server中实现。) 在定义了窗口与

  • 问题内容: 我试图弄清楚如何在MySQL中优化一个非常慢的查询(我没有设计这个): 比较一下: 说明语句对我没有帮助: 好的,它仍然认为它需要大约400万个条目才能计数,但是我可以计算文件中的行数比这还要快!我不明白为什么MySQL要花这么长时间。 这是表的定义: 版: 有什么明显的我想念的东西吗?(是的,我已经尝试过“ SELECT COUNT(change_event_id)”,但是没有性能差

  • 问题内容: 有没有办法确保子句中的所有值都匹配? 例: 我可以将IN用作:。 我需要它像跨多个行一样工作。 更新: 我需要它来列出数据库中符合指定参数的公司。公司和分类法之间存在很多关系。我正在使用Yii框架。这是我的控制器的代码: 问题答案: 您可以执行以下操作: 如果您提供架构和一些示例数据,我可以提供一个更相关的答案。 SQL小提琴示例

  • 问题内容: 如何匹配“ Hello world”或“ Hello World”形式的句子。该句子可能包含“-/数字0-9”。任何信息对我都会非常有帮助。谢谢。 问题答案: 这将做得很好。我对句子的定义:句子以非空格开头,以句点,感叹号或问号(或字符串结尾)结尾。标点符号后可能会有一个结束语。 这是输出: 正确地匹配所有这些(最后一个句子没有结尾标点符号),看起来似乎并不那么容易!

  • 本文向大家介绍count(*),count(1)和count(列名)的区别?相关面试题,主要包含被问及count(*),count(1)和count(列名)的区别?时的应答技巧和注意事项,需要的朋友参考一下 count(*),count(1)在统计的时候不会忽略Null,count(列名)在统计的时候会忽略Null。若列名为主键,count(列名)会比count(1),count(*)快,反之则c

  • 问题内容: 我有一个很长的查询,本质上是以下内容的扩展: 完成后,其中的where子句将有约40行。为了使此任务更容易,我希望做与以下类似的事情: 不幸的是,lease_id不是唯一字段,同一个suite_id可以有多个lease_id(因此,第二个查询不可用)。 鉴于此解决方案无法正常工作,是否有更好的方法来执行第一条更新语句? 问题答案: 您可以创建表类型并通过它传递值,如下所示: 如果您使用