php – 如何确保查询始终返回结果并按相关性对结果进行排序?
现在我有一个数据库设置,如下例所示:
id (int(11)) | name (varchar(20)) | food (varchar(20)) | fastfood (varchar(3)) | pricerange (int(11)) 1 | McDonalds | American | Yes | 1 2 | Outback | BBQ | No | 2 3 | Mortons | Steakhouse | No | 3 现在我的用户表单设置如下: <form action="index.php" method="GET" id="sheet"> <select name="name1" id="name1"> <option value="%">No Preference</option> <option value="outback">Outback</option> <option value="mcdonalds">McDonalds</option> <option value="mortons">Mortons</option> </select> <select name="food1" id="food1"> <option value="%">No Preference</option> <option value="american">American</option> <option value="bbq">BBQ</option> <option value="steakhouse">Steakhouse</option> </select> <select name="fast" id="fast"> <option value="%">No Preference</option> <option value="yes">Yes</option> <option value="no">No</option> </select> <select name="price" id="price"> <option value="%">No Preference</option> <option value="1">Cheap</option> <option value="2">Middle Ground</option> <option value="3">Expensive</option> </select> <input type="submit" value="Submit" id="submit"></input> <input type="clear" value="Clear" id="Clear"<input> </form> 现在当我运行以下查询时,如果不是所有字段都匹配,我将得不到任何结果.当我有整数时,我如何操纵查询以显示基于最佳匹配的结果? varchars涉及? $query = "SELECT * FROM .$usertable WHERE $name LIKE '$name' AND $food LIKE '$food1' AND $fastfood LIKE '$fast' AND $pricerange LIKE '$price' "; 全文搜索因INT而无效,“OR”不会根据最佳匹配显示结果.假设用户选择了4个选项中的3个,例如:BBQ |是的| 2 现在,在这种情况下最好的匹配将是Outback,但是因为它也试图匹配快餐,它将不会返回任何结果.如果有更多的选择,它会变得更加复杂. 如果有人能够解决这个问题的解决方案,我将非常感激. 解决方法
这实际上不是查询语法的问题.这里的问题是为您的应用程序定义您认为“最佳匹配”.对于这样的函数没有直接的最佳匹配:您需要自己定义它.一旦你这样做,你可以努力实现它.
举一个简单的例子,您可以将“最佳匹配”定义为尽可能多的显式查询参数匹配,并且int值参数尽可能接近.然后,您可以计算每场比赛的“得分”,并按此排序. 所以假设搜索是food = BBQ,快餐=是,价格= 2.您的查询可能如下所示: SELECT *,SUM( food=:food,-- if food matches,add one to score fastfood=:fastfood,-- if fastfood matches,add one to score -- finally,add 2 for an exact price match,1 for off-by-one price match,-- 0 for off-by-two matches,etc (SELECT MAX(price)-1 from foods)-ABS(price-:price) ) AS score FROM foods ORDER BY score DESC 您可以通过调整添加到分数的数量来调整每个匹配的重要程度.此外,您可以决定类别之间是否存在不同的“距离”.例如,也许“牛排??餐厅”更像是“烧烤”而非“美国”,所以牛排餐厅应该得分更高. 这是一种简单的方法,但由于您需要计算每行的分数,因此效率很低.您可以通过多个查询加快速度:首先查找完全匹配;如果找不到,请计算部分匹配的所有行的分数.只有当仍然找不到任何内容时,才会回到总表搜索中. SELECT * FROM foods WHERE food=:food AND fastfood=:fastfood AND price=:price; -- if no matches then: SELECT *,SUM(food=:food,fastfood=:fastfood,(SELECT MAX(price)-1 from foods)-ABS(price-:price)) AS score WHERE food=:food OR fastfood=:fastfood OR price=:price ORDER BY score DESC (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |