MYSQLPHP一次在多个列上检查类似的语句


MYSQL PHP check a like statement on more one column at once

我有一个搜索栏的查询。我知道我可以使用OR来拆分语句以检查不同的列:

$query = mysql_query('SELECT * FROM PRODUCTS WHERE cats LIKE "%'.$s.'%" OR sub_cats LIKE "%'.$s.'%"');

但是,如果我想检查两到三列以上的内容,那么这样做是加快速度的一种方法:

$query_string = explode('&&=',$_GET['q']);
    $db_str = 'SELECT * FROM products WHERE name, cats, sub_cats, desc, brand ';
    for($x = 0; $x < count($query_string); $x++){
        $enc = mysql_real_escape_string($query_string[$x]);
        if($x == (count($query_string) -1)){
            $db_str .= 'LIKE "%'.$enc.'%"';
        }else{
            $db_str .= 'LIKE "%'.$enc.'%" ';
        }
    }
    $query = mysql_query($db_str);

我通常在搜索栏中使用POST,但我想试试GET,它对我来说更友好

我不知道这是否会加快速度(您必须对数据进行测试)。然而,以下是只有一个比较的替代方案:

WHERE concat_ws('|', name, cats, sub_cats, desc, brand) LIKE '%$enc%'

因为like的开头有一个通配符,所以查询不使用常规索引。所以这个版本应该不会让事情慢很多,如果有的话。

不过,解决性能问题的答案可能是全文索引。

即使忽略不推荐使用的API,您的代码也不会像那样工作。你需要做这样的事情:

$searchFields = ['name', 'cats', 'sub_cats', 'desc', 'brand'];
$searchTerm = mysql_real_escape_string($query_string[$x]);
$filters = implode(' OR ', array_map(function($field) use ($searchTerm) {
    return "$field LIKE '%{$searchTerm}%'";
}, $searchFields));
$query = mysql_query('SELECT * FROM products WHERE '.$filters);

不过,它还远远不是最佳的,而且随着数据库和用户群的增长,速度会很快变慢。然而,这正是phpMyAdmin实现其数据库范围搜索的方式。如果你的数据库比几条记录还大,或者可能同时吸引多个搜索,你应该实现一个更智能的解决方案,比如全文搜索,或者实现一个外部搜索引擎,比如Apache SOLR、Amazon CloudSearch等等——像MySQL这样的关系型数据库本身并不擅长混乱的搜索,也不应该如此。

关于这句话:

我通常在搜索栏中使用POST,但我想试一试对我来说看起来更方便用户。

这不是一个很好的选择。通常:

  • GET用于可重复的请求,用户可以随心所欲地对其进行F5操作
  • POST是针对不可重复的请求,如果(过度)重复,通常会被认为是有害的

如果你的名字是谷歌,并且你在世界各地拥有大量服务器,请使用GET。如果您已经知道您的搜索性能不好,请坚持POST,不要诱惑狮子。