加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何确保查询始终返回结果并按相关性对结果进行排序?

发布时间:2020-12-13 17:42:07 所属栏目:PHP教程 来源:网络整理
导读:现在我有一个数据库设置,如下例所示: id (int(11)) | name (varchar(20)) | food (varchar(20)) | fastfood (varchar(3)) | pricerange (int(11))1 | McDonalds | American | Yes | 12 | Outback | BBQ | No | 23 | Mortons | Steakhouse | No | 3 现在我的
现在我有一个数据库设置,如下例所示:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读