[英]ZEND and MySQL - How to search and ORDER BY (sort) relevance?
我将在products
表上编写一个简单的搜索,当用户搜索某些内容时,我使用product_name LIKE %search_term%
来搜索product
表。 但是我需要按相关性对它们进行排序。
我正在使用ZEND freamwork,而我的数据库是MySQL
在这里有人问到如何在MySQL中进行ORDER BY相关性 ,有人建议对此进行很好的查询,您需要做的是:
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
进行检查,但是我们无法在ZEND中使用mysql_real_escape_string
。 然后我们必须通过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查询按相关性排序
如果要限制搜索,则可以轻松地将其添加到$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";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.