小编典典

Count和Order By Where子句匹配

sql

我正在为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匹配的数量并以此排序,以使关键字最多的问题出现在结果的顶部?


阅读 150

收藏
2021-04-28

共1个答案

小编典典

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

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插入
攻击的风险?

2021-04-28