如何获得与用户搜索的较低标准最匹配的记录?

时间:2014-03-20 05:35:47

标签: php mysql sql codeigniter optimization

我知道标题含糊不清,但我想要的是搜索符合用户搜索准确标准的产品,如果该搜索中没有太多记录,那么我想显示其他结果以及用户搜索结果。

示例:假设我有字段

productname价格类别子类别startdate enddate name city state country

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

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

在这方面的任何帮助都会非常值得注意。

4 个答案:

答案 0 :(得分:2)

如果表扫描可以获得结果,最简单的方法是最有可能只按命中数对行进行排名,并显示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

答案 1 :(得分:1)

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

Example

productname="searchcriteria"

and

productname %LIKE% "searchcriteria"

答案 2 :(得分:0)

您可以使用多个联合子选择中的限制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,更改选择的顺序,以便类别匹配高于价格或您需要的任何其他更改。

希望这有助于一些

答案 3 :(得分:0)

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

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

然后添加ORDER BY priority, <other necessary fields>

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