如何获得最匹配的记录,以较少的标准为用户搜索


How to get records which matches most to lesser criteria for user search?

我知道标题是模糊的,但是我想要搜索的是与用户搜索的精确标准匹配的产品,如果在该搜索中没有太多记录,那么我想要显示其他结果以及用户搜索结果。

示例:假设我有字段

产品名称   价格 类,,,子类别,,,startdate可以,,,enddate,,,的名字,,,城市,,,状态,,,国家

用户可以从以上所有字段进行搜索,但我希望用户搜索应该总是看到至少12个结果,无论其他结果是否匹配所有条件,意味着搜索应该从精确匹配搜索扩展到小输家(或可能没有)匹配条件。

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

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

如果表扫描可以得到结果,最简单的方法是根据点击次数对行进行排序,并显示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

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

Example
productname="searchcriteria"
and
productname %LIKE% "searchcriteria"

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

希望对大家有所帮助

如果您可以通过多个查询实现,则写入它们并通过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只留下所需的行数