簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM