我知道标题含糊不清,但我想要的是搜索符合用户搜索准确标准的产品,如果该搜索中没有太多记录,那么我想显示其他结果以及用户搜索结果。
示例:假设我有字段
productname价格类别子类别startdate enddate name city state country
用户可以搜索以上所有字段,但我希望用户搜索应该总是看到至少12个结果是否其他结果是否符合所有条件,意味着搜索应该从完全匹配搜索扩展到小失败者(或者可能不是)匹配标准。
我知道我可以通过多个查询轻松实现这一点,但我想通过一个查询或更少的查询来实现这一点。
在这方面的任何帮助都会非常值得注意。
答案 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
答案 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
只留下所需的行数