SQL-在子句中使用LIKE时,根据第一优先级对数据进行排序


SQL - sorting data according to the first priority when using LIKE in Clause

在谷歌搜索后,当在clause 中使用like时,我找不到根据优先级排序数据的答案

我使用以下查询对数据进行排序和查看:

SELECT    i.name,i.add_time,round(i.price),s.store_address
FROM      store_items i,stores s
WHERE     i.store_id = s.store_id 
AND       (lower(i.name) LIKE '%samsung glaxy%'
   OR lower(i.name) LIKE '%samsung%'
   OR lower(i.name) LIKE '%glaxy%')
ORDER BY  i.price ASC LIMIT 0,25

如何首先将Samsung Galaxy第一个like运算符的结果行排序为第一优先级,然后将SamsungGalaxy的行排序为第二优先级?

请注意:

第一优先级意味着结果行应首先显示,第二优先级

我必须把它放在我的PHP函数中。

@10086’我无法将其放入PHP CODE

我的PHP代码是:

$sort = $_COOKIE['sort'];
$price_sort = $_COOKIE['price_sort'];
$currency_value = $_COOKIE['currency_value'];
if (!isset($_GET['number'])) {
       $limit = 0;
}else{
      $limit = filter_var($_GET['number'], FILTER_SANITIZE_NUMBER_INT);
}
 $keyword_exp = explode(" ", $keyword); //separating keywords
 $like = ""; //for use like clause for every keyword
 $case = ""; // for priority selection case in query order
 $case_inc = 2;
 foreach ($keyword_exp as $value) {
          $like .= "AND lower(i.name) like '%$value%'"; 
          $case .= "WHEN lower(i.name) like '%$value%' THEN $case_inc";
          $case_inc += 1;
 } 
  //query performing to show result
  $sql_query = "SELECT i.name 'title',i.add_time 'time',round(i.price) 'price',round(i.new_price) 'new_price',s.store_address 'address' FROM store_items i,stores s WHERE i.store_id = s.store_id $like ORDER BY CASE WHEN lower(i.name) LIKE '%$keyword%' THEN 1 $case END ASC LIMIT 0,25";
  $query = mysql_query($sql_query) or die(mysql_error());
  while ($row = mysql_fetch_array($query)) :
               extract($row);
  endwhile;

我在PHP代码中的SQL查询给了我以下错误:

您的SQL语法有错误;查看与您的MariaDB服务器版本对应的手册,了解在第1行的"lower(i.name)"附近使用的正确语法,如"%refreshed%"THEN 3 END ASC LIMIT 0,25

使用CASE WHEN:

SELECT    i.name,i.add_time,round(i.price),s.store_address
FROM      store_items i,stores s
WHERE     i.store_id = s.store_id 
AND       (lower(i.name) LIKE '%samsung glaxy%' OR lower(i.name) LIKE '%samsung%' OR lower(i.name) LIKE '%glaxy%')
ORDER BY
CASE WHEN lower(i.name) LIKE '%samsung glaxy%' THEN 1
     WHEN lower(i.name) LIKE '%samsung%' THEN 2
     WHEN lower(i.name) LIKE '%glaxy%' THEN 3
     ELSE 4 END,
i.price ASC
LIMIT 0,25

您的查询不会像预期的那样快,因为:

  1. LIKE已经不区分大小写时,可以使用lower函数。select 'a' LIKE 'A'将返回true
  2. 在WHERE中使用列作为函数的参数会迫使服务器绕过其索引并处理该行:例如:lower(i.name)。一般情况下应避免出现这种情况

如果您有MySQL 5.6+,并且store_items.name的类型为CHARVARCHARTEXT,则在name列中添加FULLTEXTindex以优化其文本搜索。

ALTER TABLE store_items ADD FULLTEXT fulltext_name (name);

然后修改您的查询以使用MATCH...AGAINST语法:

SELECT i.name,i.add_time,round(i.price),s.store_address
FROM store_items i JOIN stores s ON i.store_id = s.store_id
WHERE MATCH(i.name) AGAINST('samsung galaxy')

此搜索将返回具有两个单词samsunggalaxy中的至少一个单词的所有行。同时包含这两个单词的行在结果集中会更高。

来自文档:

MATCH()采用逗号分隔的列表来命名要已搜索。"反对"需要一个字符串来搜索指示执行的搜索类型的修饰符

全文索引只能与MyISAM表一起使用。(在MySQL 5.6中以及以上,它们也可以与InnoDB表一起使用。)全文索引只能为CHAR、VARCHAR或TEXT列创建