【问题标题】:How to get records which matches most to lesser criteria for user search?如何获取最符合用户搜索条件的记录?
【发布时间】:2014-03-20 14:04:28
【问题描述】:

我知道标题不明确,但我想要搜索与用户搜索的确切条件匹配的产品,如果该搜索中没有太多记录,所以我想显示其他结果以及用户搜索结果。

示例:假设我有字段

产品名称   价格   类别   子类别   开始日期   结束日期   名称   城市   州   国家

用户可以从上述所有字段中进行搜索,但我希望用户搜索应该始终看到至少 12 个结果,无论其他结果是否符合所有条件,这意味着搜索应该从完全匹配搜索扩展到小失败者(或者可能否)匹配条件。

我知道我可以通过多个查询轻松实现这一点,但重点是我想通过一个或更少的查询来实现这一点。

在这方面的任何帮助都会非常感激。

【问题讨论】:

  • 要搜索多少行以及我们在这里谈论的查询频率如何,即它需要如何使用索引?
  • 会有多个表连接,但我在这里展示了可以执行搜索的字段,行数会达到数千,我不想多次触发查询。

标签: php mysql sql codeigniter optimization


【解决方案1】:

如果表扫描可以得到结果,最简单的方法很可能只是按命中数对行进行排名,并显示排名最高的 12 个;

SELECT 
  *,
  CASE WHEN productname='prod#1' THEN 1 ELSE 0 END +
  ...
  CASE WHEN city='city#1'        THEN 1 ELSE 0 END +
  ...
  CASE WHEN country='country'    THEN 1 ELSE 0 END rank
FROM search
ORDER BY rank DESC
LIMIT 12

An SQLfiddle example with just 3 columns implemented.

【讨论】:

  • 谢谢它解决了我的问题,但你能告诉我它对搜索时间的影响有多大吗?
【解决方案2】:

我认为两个查询可以做到这一点。首先,您使用“=”符号运行与用户条件匹配的查询,如果未找到结果,则使用“LIKE”运行另一个查询。

Example

productname="searchcriteria"

and

productname %LIKE% "searchcriteria"

【讨论】:

    【解决方案3】:

    您可以从多个联合子选择中使用限制为 12 的选择。您需要确定条件匹配优先级,例如匹配产品比类别更重要,因此在选择链中更高。

    基本上:

    SELECT * FROM (
      SELECT * FROM <table> WHERE productname = <value> AND price = <value AND category = <value> AND subcategory = <value> AND startdate = <value> AND enddate = <value> AND name = <name> AND city = <value> AND state = <value> AND country = <value>
      UNION
      SELECT * FROM <table> WHERE productname = <value>
      UNION
      SELECT * FROM <table> WHERE price = <value>
      UNION
      SELECT * FROM <table> WHERE category = <value>
         etc, etc
      UNION
      SELECT * FROM <table>
    ) LIMIT 12
    

    这是一个简化的示例,您可以调整您的联合选择标准以适应口味、使用 OR 代替 AND、更改选择的顺序以使类别匹配高于价格或您需要的任何其他更改。

    希望对大家有所帮助

    【讨论】:

      【解决方案4】:

      如果您可以通过多个查询来实现它,请编写它们并通过UNION ALL 加入。引入人工列优先级来定义应首先显示哪些结果。

      select 1 as priority...
      UNION ALL
      select 2 as priority
      UNION ALL
      select 3 as priority
      

      然后添加ORDER BY priority, &lt;other necessary fields&gt;

      最后LIMIT 12 只留下所需的行数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-19
        • 1970-01-01
        • 2022-08-16
        • 2018-10-27
        相关资源
        最近更新 更多