php - ZEND 和 MySQL - 如何搜索和 ORDER BY(排序)相关性?

标签 php mysql search zend-framework

我将在 products 表上编写一个简单的搜索,当用户搜索某些内容时,我使用 product_name LIKE %search_term% 搜索product 表。但我需要按相关性对它们进行排序。

我正在使用 ZEND freamwork,我的数据库是 MySQL

最佳答案

Here有人询问如何在 MySQL 中按相关性排序,有人建议了一个很好的查询,您需要做的是:

 SELECT  product_name
  FROM products
 WHERE product_name like '%search_term%'
 GROUP BY name
 ORDER BY CASE WHEN product_name like 'search_term %' THEN 0
               WHEN product_name like 'search_term%' THEN 1
               WHEN product_name like '% search_term%' THEN 2
               ELSE 3
          END, product_name

您将从用户那里获取search_term,并且出于安全原因必须通过mysql_real_escape_string进行检查,但我们不能使用mysql_real_escape_string在 ZEND 中。然后我们必须通过ZEND来检查它,我们使用 quote() 而不是 mysql_real_escape_string

//get the search_term what user is looking for:
 $search_term=$this->parameters['search_term'];

//mysql_real_escape_string:
$search_term= $this->db->quote($search_term);
$search_term = substr($search_term, 1, strlen($search_term)-2); //Remove quotation from it.

$query = $this->db->select();
$query->from('products', ['product_id', 'product_name', 'product_sub_name']);
$query->where('product_name LIKE ?', '%'.$search_term.'%');
$query->group('product_name');
$query.="
   ORDER BY CASE WHEN product_name like '$search_term %' THEN 0
        WHEN product_name like '$search_term%' THEN 1
        WHEN product_name like '% $search_term%' THEN 2
        ELSE 3
        END, product_name";

return $this->db->fetchAll($query);

这将返回您需要的内容,并根据我找到的上述 SQL 查询 here 按相关性排序

如果您要限制搜索,您可以轻松地将其添加到$query变量中。然后您将拥有(例如将其限制为 10 个结果):

$query.="
   ORDER BY CASE WHEN product_name like '$search_term %' THEN 0
      WHEN product_name like '$search_term%' THEN 1
      WHEN product_name like '% $search_term%' THEN 2
      ELSE 3
      END, product_name
      LIMIT 0 , 10";

关于php - ZEND 和 MySQL - 如何搜索和 ORDER BY(排序)相关性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35598122/

相关文章:

PHP-MySQL连接错误

php - CakePHP - HABTM 分页查询问题

android - Sqlite 还是共享首选项更适合使用 MPAndroid 库以每日、每周、每月为基础获取数据?

elasticsearch - 如果是多重排序,Elastic Search的响应速度会变慢吗?[不是脚本排序]

php - 查找下次营业时间; mysql小时计算

php - 使用音频文件创建图像并上传到Facebook

mysql - 层次表-如何获取项目的路径[MySQL中的链表]

mysql - 如何在mysql中选择每列的前3个值

search - Elasticsearch 返回给定类型的所有文档

javascript - 搜索 API : How come "Ondřej" matches "ondrej"? 我需要在浏览器中模仿它