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

标签 php mysql sql sorting

谷歌搜索后,我找不到在 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 运算符作为第一优先级,然后对 Samsung 的行进行排序银河系是第二优先?

请注意:

第一优先级表示应首先显示结果行,第二优先级表示应在之后显示其他结果行

我必须将它放入我的 PHP 函数中。

@10086'answer 我无法将其放入 PHP 代码

我的 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 查询给出了以下错误:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'lower(i.name) like '%refurbished%' THEN 3 END ASC LIMIT 0,25' at line 1

最佳答案

使用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

关于php - SQL-在子句中使用LIKE时根据第一优先级对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38433371/

相关文章:

mysql - 计算用户相互汇款的交易表中的余额

php - 来自 PHP 的 Redis 连接缓慢

php - 如何检查正则表达式中的任何内容

javascript - 从 Google Maps API 到 php 表单的坐标变量

mysql - phpmyadmin权限表版本问题

php - 如何使用链接到 mysql 数据库的 php 创建一个简单的下拉列表

php - 我认为 PHP 将我的输入视为八进制,让它停止吗?

mysql - 使用触发器在插入后使用创建新记录并从另一个表中选择

sql - 仅更新 mysql DateTime 字段中的时间

SQL查询以查找表中列值的多次出现次数?